代码之家  ›  专栏  ›  技术社区  ›  Petok Lorand

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

  •  0
  • Petok Lorand  · 技术社区  · 6 年前

    我正在尝试使用调用模板成员函数 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 回复  |  直到 6 年前
        1
  •  2
  •   DeiDei    6 年前

    两个问题:

    首先,函数模板采用一个类型参数,而不是两个。
    第二,你的功能不是 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;
    }
    
        2
  •  3
  •   Fureeish    6 年前

    问题是你试图打电话给 成员 没有对象的函数。有两种解决方案:

    1. 作记号 eval 作为 static .
    2. 创建一个 Node 对象和 std::invoke 这个 埃瓦 方法。如下所示:

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

    这里, n 对象作为对象传递给 this 指针指向 埃瓦 方法。