如何使用通用函数指针作为模板参数?

时间:2013-09-25 14:48:51

标签: c++ templates function-pointers

是否可以使用通用函数指针作为模板参数?函数指针模板可以接受自由函数,成员函数和lambda函数。为简单起见,假设函数只有一个参数,比如

template<class ArgumentT, class ReturnT, function* f>
struct A
{
   // f is used somewhere.
};

4 个答案:

答案 0 :(得分:9)

普通模板参数可以引用函数。

#include <iostream>

template <class ArgT, class RetT, class F>
struct A {
    F f;
public:
    A(F f) : f(f) {}

    RetT operator()(ArgT arg) { return f(arg); }
};

int unchanged(int i) { return i; }

int main(){
    A < int, int, int(*)(int)> t{ unchanged };

    for (int i = 0; i < 10; i++)
        std::cout << t(i) << "\n";
}

虽然没有任何限制函数的模板参数 - 你可以轻松地使用一些重载operator()的类,然后调用它(事实上,这通常更可取)。

答案 1 :(得分:2)

我建议使用std :: function&lt;&gt;如果你可以使用C ++ 11或boost :: function&lt;&gt;如果你不能:

template<class ArgumentT, class ReturnT > struct A { 
    typedef std::function< ReturnT( ArgumentT ) > Function;
    void foobar( Function f ) { ReturnT ret = f( arg ); }
};

在这种情况下,您可以传递函数指针,仿函数,lambda或使用std :: bind或boost :: bind几乎任何签名不匹配的函数。在这种情况下我不确定你需要模板,你可以直接使用std :: function,但这取决于你的代码。

答案 2 :(得分:0)

您正在组合类型和数据,您需要更多类似的内容:

template<class ArgumentT, class ReturnT, typename F*>
struct A {
    //use F* to refer to f somewhere
};

答案 3 :(得分:0)

你可以通过以下方式实现目标:

template<class ArgumentT, class ReturnT, class F, F f>
struct A;

template<class ArgumentT, class ReturnT, ReturnT (*f)()>
struct A<ArgumentT, ReturnT, ReturnT (*)(), f>
{
   // f is used somewhere.
};

template<class ArgumentT, class ReturnT, class C, ReturnT (C::*f)()>
struct A<ArgumentT, ReturnT, ReturnT (C::*)(), f>
{
   // f is used somewhere.
};

...但是您不能将std::function<ReturnT ()>之类的内容作为非类型模板参数。函数指针的特化也将接受非捕获lambdas。