函数/仿函数作为模板参数。他们可以存储吗?

时间:2012-03-02 15:17:32

标签: c++ templates callback

想象一下,我有以下免费功能和仿函数:

void myFreeFunction(void)
{
    cout << "Executing free function" << endl;
}

struct MyFunctor
{
    void operator()(void)
    {
        cout << "Executing functor" << endl;
    }
};

this answer所述,我可以将我的函数或仿函数作为模板参数传递给另一个函数:

template <typename F>
void doOperation(F f)
{
    f();
}

然后致电:

doOperation(myFreeFunction);
doOperation(MyFunctor());

到目前为止一切顺利。但如果我想要以下内容会怎么样:

template<typename Callback>
class MyClass
{
private:
    Callback mCallback;

public:
    MyClass(){}

    void execute()
    {
        mCallback();
    }
};

在这种情况下,我在声明类时指定函数/函子,但直到稍后才调用它。它适用于仿函数:

MyClass<MyFunctor> myClass1;
myClass1.execute();

但不适用于功能:

MyClass<myFreeFunction> myClass2;
myClass2.execute();

编译说:

  

错误C2923:&#39; MyClass&#39; :&#39; myFreeFunction&#39;不是参数&#39; Callback&#39;

的有效模板类型参数

这是公平的......但你会如何构建这个?

注意:我知道std :: function,最终可能会使用它。它虽然速度慢得多,但我还在考虑所有选项。

谢谢,

大卫

1 个答案:

答案 0 :(得分:7)

问题是freefunction不是一个类型而是一个元素(在这种情况下是一个函数指针。

要解决这个问题,你需要在构造中传递函数,但是你仍然需要知道确切的类型。

myclass<call_back_t> my_class(call_back);

编辑:在c ++ 11中,类型可以从decltype(call_back)

获得

然而,回复可能很麻烦,创建生成器函数通常要容易得多

//this should be in the namespace of the class or a static member of it
template<FuncType>
myclass<FuncType> make_class(FuncType func)
{
     return myclass<FuncType>(func);
}
//called like
myclass mc=make_class(&my_callback);

不要改变构造函数

template<typename CallBack>
myclass{
private:
   CallBack call_back;
public:
   myclass(CallBack call_back_)
   : call_back(call_back_)
   {}
};

或类似的东西