c++ - 将重载函数转换为模板仿函数

标签 c++ c++11 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;
}

关于c++ - 将重载函数转换为模板仿函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23340016/

相关文章:

c++ - STL 中令人烦恼的解析 scott meyers

c++11:使用中央命令映射器调用虚拟基类方法

c++ - 从转换运算符提取返回和参数类型到函数指针

c++ - 如何轻松知道编译器选择了哪些特殊成员函数?

c++ - 如何动态访问函数对象的目标

C++:未定义对仿函数重载调用运算符的引用

c++ - 关于阈值技术/图像二值化的建议

c++ - 使用 "typename Container::value_type"作为返回值时无法推断模板参数

python - 如何在 Raspberry Pi 上使用 TBB 构建 OpenCV?

c++ - () 仿函数后的括号而不是函数指针?