首页 文章

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

提问于
浏览
7

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

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:'MyClass':'myFreeFunction'不是参数'Callback'的有效模板类型参数

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

Note: 我'm aware of std::function and may end up using this. It'的速度明显慢了所以我正在考虑所有的选择 .

谢谢,

大卫

1 回答

  • 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_)
       {}
    };
    

    或类似的东西

相关问题