そのため、関数ポインターの配列を格納できる 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)
{
}
正常に動作しますが、関数オブジェクトをベクターにプッシュしようとすると、同じエラーが再びスローされます。
これを解決する方法はありますか?
渡されたポインターをキャッシュする必要があります。