【问题标题】:Using std::invoke to call templated function使用 std::invoke 调用模板化函数
【发布时间】:2019-01-06 19:15:48
【问题描述】:

我正在尝试使用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)'

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

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

【问题讨论】:

  • eval 需要一个 Node 对象来操作。
  • 您可以将eval 标记为static,这样就可以解决问题。正如@MilesBudnek 上面所说 - 需要在Node 对象上调用eval。

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


【解决方案1】:

两个问题:

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

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

    【讨论】:

      猜你喜欢
      • 2016-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-18
      • 1970-01-01
      • 2018-05-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多