Итак, у меня есть класс 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 Не удалось специализировать шаблон функции ‘неизвестный тип std :: invoke (_Callable) &&, _Types &&…) ‘)
Но когда я изменяю определение Bind на следующее:
template<typename F>
void Bind(F f)
{
}
Он работает нормально, но когда я пытаюсь вставить объект функции в вектор, он снова выдает ту же ошибку.
Есть ли способ решить это?
Мне нужно кешировать переданные указатели.
Результат 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)...);
}
}
};
Других решений пока нет …