我有一些重载函数,例如
int a(int) {/*...*/}
float a(float) {/*...*/}
/* ... */
int b(int) {/*...*/}
float b(float) {/*...*/}
/* ... */
我的目标是将这些函数包装到仿函数对象中:
template <typename T>
struct func_a {
auto T operator()(T t) -> decltype(a(t)) {return a(t);}
};
有没有一种方法可以在以重载函数为参数的其他模板上定义上述模板结构?像这样:
template </* pointer to an overloaded function f */>
struct create_functor {
template <typename T>
struct func {
auto operator()() -> decltype(f(t)) {return f(t);}
}
};
所以我可以在编译时生成结构,如:
typedef create_functor<a>::func<int> func_a_int;
typedef create_functor<a>::func<float> func_a_float;
typedef create_functor<b>::func<int> func_a_int;
typedef create_functor<b>::func<float> func_a_float;
最佳答案
您可以为每个函数定义一个重载集,例如:
int a(int i) {return 2*i;}
float a(float d) {return 3*d;}
#define overload_set(f, f_set) \
struct f_set { \
template <typename... Args> \
auto operator()(Args&&... args) \
-> decltype(f(std::forward<Args>(args)...)) \
{ \
return f(std::forward<Args>(args)...); \
} \
}
overload_set(a, a_set);
// more overload_set here...
使用重载集而不是函数指针使“create_functor”的实现变得简单:
template <typename OverloadSet>
struct create_functor {
template <typename... Args>
struct func {
auto operator()(Args... args)
-> decltype(OverloadSet{}(args...))
{
return OverloadSet{}(args...);
}
};
};
create_functor<a_set>::func<int> func_a_int; // Note: no need for typedef here
create_functor<a_set>::func<float> func_a_float;
int main()
{
std::cout << func_a_int(2) << std::endl;
std::cout << func_a_float(3.) << std::endl;
}
关于c++ - 将重载函数转换为模板仿函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23340016/