有没有一种通用的方法来使函数模板适应多态函数对象?

HC4*_*ica 12 c++ templates static-polymorphism function-template

例如,我有一些功能模板

template <typename T>
void foo(T);

template <typename T>
void bar(T);

// others
Run Code Online (Sandbox Code Playgroud)

我需要将每一个传递给一个算法,该算法将用各种类型调用它,例如

template <typename F>
void some_algorithm(F f)
{
    // call f with argument of type int
    // call f with argument of type SomeClass
    // etc.
}
Run Code Online (Sandbox Code Playgroud)

我无法传递我的函数模板未实例化,但我无法使用任何特定类型实例化它,因为some_algorithm需要使用几种不同类型的参数调用它.

我可以将我的函数模板调整为多态函数对象,例如

struct foo_polymorphic
{
    template <typename T>
    void operator()(T t)
    {
        foo(t);
    }
};
Run Code Online (Sandbox Code Playgroud)

然后传递给它some_algorithm(foo_polymorphic()).但这需要为我的每个功能模板编写一个单独的适配器.

是否有一个通用的适应函数模板是一个多态函数对象,即一些机制,我可以重新使用的每一个我需要适应的功能模板,而不必为每一个单独声明什么方式?

Luc*_*ton 2

问题的简短版本被赋予了一个重载名称,即f如何简洁地编写一个最终调用的对象。ffff(a0, a1, a2, ...)f(a0, a1, a2, ...)

多态函子,你如何指出自己,是通常的解决方案。但它必须被定义为不符合要求(因为它有一个模板成员),所以我认为这对于我的答案来说不够简洁。

目前 lambda 表达式产生一个单态函子,因此它们很接近,但还不够。

// set of functions overloaded on int and double
void f(int);
void f(double);

auto ff = [](int i) { return f(i); };
Run Code Online (Sandbox Code Playgroud)

正如 GMan 在评论中指出的那样,多态 lambda 将(应该?)成为简洁地内联编写多态函子的解决方案。

同时,可以编写一个make_overload将多个函子组合成一个的帮助器,这样

auto ff = make_overload(
    [](int arg0) { return f(arg0); }
    , [](double arg0) { return f(arg0); } );
Run Code Online (Sandbox Code Playgroud)

将“捕获”整个过载集。也许 Boost.Preprocessor 宏可以在这里提供帮助,以便auto ff = POLYMORPHIC_LAMBDA( 1, (int)(double), { return f(arg0); } );内联使用。然而,我怀疑存在数量限制(因此是第一个宏参数),这与通常的外线手写多态函子解决方案不同;所以这对例如可变参数函数模板没有帮助。