我可以给模板参数指定函数吗?

时间:2015-12-08 01:30:55

标签: c++ c++11

我可以这样做吗?

template<function_pointer_type pointer_name> struct structure1{
   //here I call pointer_name(0)
};

void* function1 = [&](int a) {
   return a * a;
}
structure1<function1> b;

我试过但它从未编译过。

2 个答案:

答案 0 :(得分:1)

那么,代码有什么问题?

  1. function1不是常量表达式,因此不能用作模板参数。
  2. lambda不能转换为函数指针,因为它有一个非空的捕获列表。
  3. 我建议使用函数对象的模板参数,或std::function

    ,而不是函数指针

    功能对象:

    template <class FunctionObject>
    class A
    {
    private:
        FunctionObject fun;
    
    public:
        A(FunctionObject f) : fun(f) {}
    
        void f() { cout << fun(5) << endl; }
    };
    
    template <class FunctionObject>
    A<FunctionObject> make_A(FunctionObject f)
    {
        return A<FunctionObject>(f);
    }
    

    std::function

    template <class FunctionType>
    struct B
    {
        std::function<FunctionType> fun;
    };
    

    用法:

    void usage()
    {
        auto a = make_A([](int a) {return a*a; });
        a.f();
    
        B<int(int)> b;
        b.fun = [&](int a) {return a*a; };
        cout << b.fun(10) << endl;
    }
    

答案 1 :(得分:1)

使其尽可能与原始问题完全相似(使用lambda和模板化结构等):

#include <iostream>

template<typename F>
struct structure1 {
    structure1(F x) : f(x) {}
    int operator() (int a) { return f(a); };
    F f;
};

int(*function1)(int) = [&](int a) {
    return a * a;
};

int main() {
    structure1< int(*)(int) > x(function1);
    std::cout << x(4) << std::endl;
    return 0;
}

我用g++ -std=c++11 test.cpp

编译并测试了这个