0

そのため、関数ポインターの配列を格納できる 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 &&,_Types &&...)')

しかし、Bind の定義を次のように変更すると:

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

}

正常に動作しますが、関数オブジェクトをベクターにプッシュしようとすると、同じエラーが再びスローされます。

これを解決する方法はありますか?

渡されたポインターをキャッシュする必要があります。

4

1 に答える 1

1

の結果はstd::bind関数ポインタではありません (未指定の型の関数オブジェクトです) が、それを 1 つにしようとしています。を使用しているため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)...);
        }
    }
};
于 2016-06-14T16:40:26.607 に答える