问题描述
(这是对我的 this 问题的部分跟进。)
正如我在 this self-answer 中所写,我发现 Boost 提供了一个 macro to wrap a template function in a function object so it can be passed to higher-order functions:
#include <boost/hof.hpp>
#include <cassert>
#include <algorithm>
// Declare the class `max_f`
BOOST_HOF_LIFT_CLASS(max_f,std::max);
int main() {
auto my_max = BOOST_HOF_LIFT(std::max);
assert(my_max(3,4) == std::max(3,4));
assert(max_f()(3,4));
}
关键是 MSVC 的情况不太好,这个问题困扰着我,尤其是当某些模板参数无法推导出并且必须明确提供相应的参数时,例如 std::get
,只是举个例子。
以下适用于 GCC,但使用 MSVC 时出错
template<int N>
auto constexpr getNth_a = BOOST_HOF_LIFT(std::get<N>);
// usage
std::tuple<int,int> t{1,2};
getNth_a<0>(t); // errors with MSVC
所以我尝试了 BOOST_HOF_LIFT_CLASS
,但在模板化时我无法让它工作,即使在 GCC 中也无法工作:
template<int N>
BOOST_HOF_LIFT_CLASS(getNth_b,std::get<N>);
// attempted usage
std::tuple<int,2};
getNth_b<0>(t); // doens't even work with GCC
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)