Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 函数/函子作为模板参数。它们可以储存吗?_C++_Templates_Callback - Fatal编程技术网

C++ 函数/函子作为模板参数。它们可以储存吗?

C++ 函数/函子作为模板参数。它们可以储存吗?,c++,templates,callback,C++,Templates,Callback,假设我有以下自由函数和函子: void myFreeFunction(void) { cout << "Executing free function" << endl; } struct MyFunctor { void operator()(void) { cout << "Executing functor" << endl; } }; 到目前为止还不错。但是,如果我想要下面这样的东西怎么办

假设我有以下自由函数和函子:

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

struct MyFunctor
{
    void operator()(void)
    {
        cout << "Executing functor" << endl;
    }
};
到目前为止还不错。但是,如果我想要下面这样的东西怎么办:

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

public:
    MyClass(){}

    void execute()
    {
        mCallback();
    }
};
模板
类MyClass
{
私人:
回调mCallback;
公众:
MyClass(){}
void execute()
{
mCallback();
}
};
在本例中,我在声明类时指定了函数/函子,但直到稍后才调用它。它适用于函子:

MyClass<MyFunctor> myClass1;
myClass1.execute();
MyClass-myClass1;
myClass1.execute();
但不适用于以下功能:

MyClass<myFreeFunction> myClass2;
myClass2.execute();
MyClass-myClass2;
myClass2.execute();
编译器说:

错误C2923:'MyClass':'myFreeFunction'不是参数'Callback'的有效模板类型参数

这很公平。。。但是你会如何构建这个呢

注意:我知道std::function,可能最终会使用它。不过速度要慢得多,所以我正在考虑所有的选择

谢谢


David

问题在于freefunction不是一个类型,而是一个整型的元素(在本例中是一个函数指针)

要解决此问题,您需要在构造中传入函数,但是您仍然需要知道确切的类型

myclass<call_back_t> my_class(call_back);
不需要修改构造函数

template<typename CallBack>
myclass{
private:
   CallBack call_back;
public:
   myclass(CallBack call_back_)
   : call_back(call_back_)
   {}
};
模板
我的班级{
私人:
回拨电话;
公众:
myclass(回调回叫)
:回拨(回拨)
{}
};

或者类似的东西

使用boost::bind()和boost::function(),你可以完成你想要的。如果有兴趣,我可以提供一个例子。谢谢,但正如最后提到的,我已经意识到std::function是一个解决方案。由于函数没有内联,它似乎有性能开销。非常好,谢谢你提供的信息。我已经按照你的建议调整了MyClass,现在我可以做:m呃,看来我不能在评论中添加更多的问题。基本上你的解决方案对函子和函数都有效,所以谢谢。我对函子有一个小的语法问题,但如果我不能解决,我会问一个新问题。@PolyVox编辑你的帖子或在这里发布我会尝试帮助你的,谢谢,但我已经解决了。我由于在尝试构造我的functor.P.s.时遇到了“最麻烦的解析”问题,我可以确认您的解决方案确实比使用std::function:-)更快
myclass<call_back_t> my_class(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_)
   {}
};