Массив указателей на функции (включая функции-члены), генерирующих ошибку специализации шаблона

Итак, у меня есть класс 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)
{

}

Он работает нормально, но когда я пытаюсь вставить объект функции в вектор, он снова выдает ту же ошибку.

Есть ли способ решить это?

Мне нужно кешировать переданные указатели.

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)...);
        }
    }
};
Другие вопросы по тегам