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

时间:2019-01-06 19:15:48

标签: c++ function-pointers c++17 member-function-pointers

我正尝试使用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(未解析的重载   函数类型,int,int)'

我认为这意味着功能模板实际上并未实例化。

我错过了什么才能打通电话?

2 个答案:

答案 0 :(得分:3)

问题是您尝试在没有对象的情况下调用 member 函数。有两种解决方案:

  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对象作为指向this方法的eval指针的对象传递。

答案 1 :(得分:2)

两个问题:

首先,您的函数模板使用一个类型参数,而不是两个。
其次,您的函数不是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;
}