使用 std::invoke 调用模板化函数



我正在尝试使用std::invoke调用模板化成员函数,如下面截取的代码所示。

#include <functional>
#include <iostream>
struct Node
{
    template <typename T>
    T eval(T lhs, T rhs) { return lhs + rhs; }
};
int main(void)
{
    std::cout << std::invoke(&Node::eval<int>, 1, 2);
    return 0;
}

GCC 8.1 给了我错误

没有匹配函数来调用'invoke(未解析的重载) 函数类型,整数,整型)'

我认为这意味着函数模板实际上没有实例化。

我错过了什么才能使通话成为可能?

两个问题:

首先,函数模板采用一个类型参数,而不是两个。
其次,你的函数不是static的,因此你不能在没有对象的情况下使用它。

struct Node
{
    template <typename T>
    static T eval(T lhs, T rhs) { return lhs + rhs; }
    ^^^^^^
};
int main(void)
{
    std::cout << std::invoke(&Node::eval<int>, 1, 2);
                                         ^^^
    return 0;
}

问题是您尝试调用没有对象的成员函数。有两种解决方案:

  1. 马克eval饰演static .
  2. 创建一个Node对象,并在该对象上std::invoke eval 方法。它看起来像这样:

    int main()
    {
        Node n{};
        std::cout << std::invoke(&Node::eval<int>, n, 1, 2);
        return 0;
    }
    

在这里,n对象作为指向eval方法的指针this的对象传递。

相关内容

  • 没有找到相关文章

最新更新