【发布时间】:2019-01-14 13:30:41
【问题描述】:
上下文
在与数学相关的上下文中,我想定义处理<cmath> 函数的函子。出于这个问题的目的,我们将使用std::invoke 作为我们的函子。
这是格式错误的(live demo):
std::invoke(std::sin, 0.0);
(g++-8.1) 错误:没有匹配的函数调用 'invoke(
, double)'
确实,std::sin 是一个重载集,编译器缺少类型信息来选择其中一个函数。
问题
如何从重载集中命名特定函数?我们可以用什么替换 LEFT 和 RIGHT 以使以下内容格式正确并符合预期(例如,选择 double std::sin(double))?
#include <functional>
#include <cmath>
int main()
{
(void) std::invoke(LEFT std::sin RIGHT, 0.0);
}
如果这是不可能的,有没有办法定义一个函子,使其能够感知重载集?
【问题讨论】:
-
它必须采用
LEFT和RIGHT的样式,或者将std::sin分配给函数指针或std::function然后使用它来调用@987654337 @ ? -
@user463035818 它需要在调用者站点很好。例如
my_invoke<double(double)>(std::sin, 0)可以。 -
@RobertAndrzejuk 这不是同一个问题:您提出的 dup 是模板扣除失败;我的问题是“如何从重载集中命名特定函数”。两者之间有重叠,但并不相同。
标签: c++ c++17 overloading overload-resolution