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

Using std::invoke to call templated function

我正在尝试使用 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 给我错误

no matching function for call to 'invoke(unresolved overloaded function type, int, int)'

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

我缺少什么才能使通话成为可能?

问题是您尝试调用没有对象的 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 对象作为指向 eval 方法的 this 指针的对象传递。

两个问题:

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