抛出模板专业化错误的函数指针数组(包括成员函数)

Posted

技术标签:

【中文标题】抛出模板专业化错误的函数指针数组(包括成员函数)【英文标题】:Array of function pointers ( including member functions) throwing template specialization error 【发布时间】:2016-06-14 16:32:40 【问题描述】:

所以,我有一个名为 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)



它工作正常,但是当我尝试将函数对象推入向量时,它再次抛出相同的错误。

有没有办法解决这个问题?

我需要缓存传入的指针。

【问题讨论】:

【参考方案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)...);
        
    
;

【讨论】:

我将其更改为以下内容,但仍然抛出错误: void Bind(std::function f) mListOfFunctions.push_back(f); 你为什么要这么做?你为什么不使用我发布的代码? 我也这样做了:模板 class delegate private: public: typename std::vector<:function>> mListOfFunctions; void Bind(std::function f) mListOfFunctions.push_back(f); template void Invoke(TArgs&&...arg) for (auto f : mListOfFunctions) f(std::forward(arg)...); ;但是当我调用 Bind 时,它会再次引发该错误 完美编译:ideone.com/pBJB3P 提供更多信息。编辑您的问题并显示 1. 您如何调用 Bind 2. 确切的新错误消息。 在您的情况下,您没有使用成员函数。但是,当我尝试使用 std::bind 添加成员函数并将其作为 std::function 传递时,它会引发与问题中相同的错误(C2893)

以上是关于抛出模板专业化错误的函数指针数组(包括成员函数)的主要内容,如果未能解决你的问题,请参考以下文章

C++ 成员函数指针和 STL 算法

将成员函数传递给模板函数时出现语法错误

成员函数指针数组:当控件到达指向成员函数的指针时获取 0xcccccccc

基类的函数指针指向子类的成员函数?

将指向 int 数组的指针传递给成员函数,错误:数组下标的无效类型“int [int]”

GCC C++14/17 成员函数指针模板参数的区别