所以,我有一个名为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)
{
}
它运行正常,但是当我尝试将函数对象推入向量时,它会再次抛出相同的错误。
有没有解决这个问题?
我需要缓存传入的指针。
答案 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)...);
}
}
};