使用 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 函数。有两种解决方案:
- 将
eval
标记为 static
。
创建一个 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;
}
我正在尝试使用 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 函数。有两种解决方案:
- 将
eval
标记为static
。 创建一个
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;
}