函数指针数组(包括成员函数)抛出模板特化错误

时间:2016-06-14 16:32:40

标签: c++ pointers stdbind mem-fun

所以,我有一个名为Delegate的类,它可以存储一组函数指针。这是代码:

template<typename Func>
class delegate
{
private:
public:
    typename std::vector<Func> mListOfFunctions;
    void Bind(Func f)
    {
        mListOfFunctions.push_back(f);
    }
    template<typename...TArgs>
    void Invoke(TArgs&&...arg)
    {
        for (auto f : mListOfFunctions)
        {
            f(std::forward<TArgs>(arg)...);
        }
    }
};

Player.cpp中的用法:

delegate<void(float)> testDelegate;
testDelegate.Bind(std::bind(&Player::MoveLeft,this));

这会引发错误C2893(错误C2893无法专门化函数模板'unknown-type std :: invoke(_Callable&amp;&amp;,_ Types&amp;&amp; ...)')

但是当我将Bind的定义更改为以下内容时:

template<typename F>    
void Bind(F f)
{

}

它运行正常,但是当我尝试将函数对象推入向量时,它会再次抛出相同的错误。

有没有解决这个问题?

我需要缓存传入的指针。

1 个答案:

答案 0 :(得分:1)

std::bind的结果不是函数指针(它是未指定类型的函数对象),但是你试图把它变成一个。由于您使用的是std::forward,因此您必须使用C ++ 11,这意味着您可以使用std::function

template<typename Func>
class delegate
{
private:
public:
    typename std::vector<std::function<Func>> mListOfFunctions;
    void Bind(std::function<Func> f)
    {
        mListOfFunctions.push_back(f);
    }
    template<typename...TArgs>
    void Invoke(TArgs&&...arg)
    {
        for (auto f : mListOfFunctions)
        {
            f(std::forward<TArgs>(arg)...);
        }
    }
};