7

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

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

4 回答 4

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(),然后调用它(事实上,这通常是更可取的)。

于 2013-09-25T14:58:47.967 回答
2

如果可以使用 C++11,我建议使用 std::function<> ;如果不能,我建议使用 boost::function<>:

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 ,但这取决于您的代码。

于 2013-09-25T15:11:29.637 回答
0

您正在组合类型和数据,您想要更多类似的东西:

template<class ArgumentT, class ReturnT, typename F*>
struct A {
    //use F* to refer to f somewhere
};
于 2013-09-25T14:55:22.670 回答
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.
};

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

于 2013-09-25T15:00:28.660 回答