将重载函数转换为模板函子
Convert overloaded function to template functor
我有一些重载函数,例如
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;
}
只要不同重载的签名像您的问题中一样一致,就可以通过使用函数指针值作为模板参数来完成:
template<typename T>
struct create_functor {
template<T(*fct)(T)>
struct functor {
T operator()(T n) { return fct(n); }
};
};
create_functor<int>::functor<a> func_a_int;
create_functor<float>::functor<a> func_a_float;
std::cout << func_a_int(42) << func_a_float(3.14f) << std::endl;
相关文章:
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 可以打印矢量和矢量中的矢量的非重载C++函数
- 错误 没有与参数列表匹配的重载函数"getline"实例
- 使用模板重载函数
- C++线程中,没有重载函数接受 X 参数
- std::vector 没有重载函数的实例与参数列表匹配
- C++重载函数,一个采用基类的参数,另一个采用派生类的参数
- 错误:无法解析对重载函数的引用;你的意思是调用它吗?
- 对重载函数find_first_not_of的不明确调用
- 如何从重载解析中删除重载函数?
- CUDA:重载函数"isnan"的多个实例
- C++派生类重载函数(带有 std::function 参数)不可见
- 避免在人为的重载函数调用中拼写出类型
- C++:如何为多个重载函数保留通用代码路径?
- 什么时候可以使用常量装饰调用我的重载函数?
- 尝试使用谓词函数会导致错误:"std::sort"未找到匹配的重载函数
- std::调用,未找到匹配的重载函数
- 为什么在传递长整型时调用具有两个双精度类型的参数的重载函数?
- 为什么使用不匹配的参数调用重载函数仍然有效
- 如何通过签名作为模板参数来解决重载函数?