如何使用模板函数调用函子模板类
How to call a Functor template class with template function
考虑下面简化的一元函子的代码
#include <type_traits>
template <class FuncT, class FuncArgT>
class UnaryFunctor
{
FuncT func;
public:
UnaryFunctor(FuncT const& func) : func(func) {}
template <class ArgsT> struct result {};
template <class F, class ArgT>
struct result < F(ArgT) >
{
typedef typename std::result_of<FuncT(ArgT)>::type type;
};
template <class ArgT>
typename result<UnaryFunctor(ArgT)>::type
inline operator()(ArgT const& arg) const
{
return func(arg);
}
};
template <class FuncT, class ArgT>
struct Result
{
typedef typename std::result_of<UnaryFunctor<FuncT, ArgT>(ArgT)>::type type;
};
template <class FuncT, class ArgT>
typename Result<FuncT, ArgT>::type
inline unary_apply(FuncT const& func, ArgT const& arg)
{
return UnaryFunctor<FuncT, ArgT>(func)(arg);
}
因此,本质上目的是调用具有正在传递的值的函数。假设我们有下面两个简单的函数。
template <class T> T addValueTemplate(T const& val) { return val + 3; }
unsigned int addValue2(unsigned int const& val) { return val + 3; }
打电话这个很好
unsigned int i = 1, j;
j = unary_apply(&addValue2, i);
但是除了模板类addValueTemplate之外,我无法弄清楚如何做同样的事情。例如,这不会编译
j = unary_apply(&addValueTemplate<unsigned int>, i);
有没有办法做到这一点?顺便说一下,这在 GCC 中编译得很好,但在 msvc 中编译不行
看起来像MSVC中的一个错误。它认为&addValueTemplate<unsigned int>
是一个函数,而不是一个函数指针。使用中间函数指针变量:
unsigned int (*av)(unsigned int const&) = &addValueTemplate;
j = unary_apply(av, i);
或者用它来愚弄 MSVC:
template <typename T>
T* identity(T* x) { return x; }
j = unary_apply(identity(&addValueTemplate<unsigned int>),i);
(为了完整起见,常量/非常量/右值引用/指针的重载identity
)
相关文章:
- 构造函数正在调用一个使用当前类类型的函数
- 使用共享指针的函数调用,其对象应为 const
- 将参数打包的参数传递到 std::queue 中,以便稍后使用不同的函数调用
- 使用动态链接加载程序 <dlfcn.h> 而不是直接函数调用的目的是什么?
- 使用 std::find 时没有匹配的函数调用错误
- 了解在返回值之前和之后使用 EAX 的函数调用
- 使用显式模板参数列表和 [temp.arg.explicit]/3 的函数调用的演绎失败
- 使用成员初始值设定项列表时没有匹配的函数调用错误
- 是否可以使用三元切换/控制/谓词成员函数调用?
- 使用回调函数从构造函数调用虚拟/派生方法的替代方法?
- 在函数调用中使用类型vector<pair<int,int>>::iterator&in
- 在函数调用之前使用(void)
- 在C++的函数调用中使用模板定义的变量
- 在函数调用中使用多个星号有什么用?
- 不能在函数调用中使用int后减量
- 存储一个函数的迭代结果,并在被另一个函数调用时使用它们
- 在一个函数调用中创建线程池,并从另一个函数调用来使用它
- void函数调用无法使用c++
- 在API函数调用中使用nullptr
- 没有匹配的函数调用,使用函数指针