【问题标题】:C++ - Specify Overloaded Functor or Function When Passing To `std::function`C++ - 传递给`std::function`时指定重载的函子或函数
【发布时间】:2020-09-14 22:50:07
【问题描述】:

所以我想将数学函子传递给std::functions。

    std::function< double( double ) > squareRoot( std::sqrt );

我收到一条错误消息,说它无法解决 MSVC 和 GCC 上的过载问题。然而这有效

    std::function< double( double ) > squareRoot( ( double( * )( double ) ) std::sqrt );
    std::cout << squareRoot( 4.0 ) << "\n";

如果我们传递函子的地址,它会很有效

    std::function< double( double ) > squareRoot( ( double( * )( double ) ) &std::sqrt );
    std::cout << squareRoot( 4.0 ) << "\n";

后两个(平凡的)程序都会产生有效的输出。

在将函子传递给std::function 之类的东西时,指定函子的特定重载的正确方法是什么(如果有人可以解释模板参数语法,特别是与此相关的)?

更新 0

以下适用于 GCC 但不适用于 MSVC,因此我正在更新标题以包含函数。

std::function< double( double ) > squareRoot( sqrt );

更新 1

前面的示例在 GCC 和 MSVC 下都适用,只包含 &lt;cmath&gt;,但在后面包含 &lt;math.h&gt; 时不适用。我不确定我实际上是在处理函数还是函子。

【问题讨论】:

    标签: c++ casting overloading functor std-function


    【解决方案1】:

    您所做的方式(将std::sqrt 转换为所需的特定函数指针类型)是挑选您想要的特定重载的正确方法。正如您所观察到的,无论是否使用显式 &amp;,它都可以使用。使用static_cast&lt;double(*)(double)&gt; 比使用C 风格转换被认为是更好的风格,以避免意外执行reinterpret_cast

    这里没有需要注意的特殊模板参数语法。 std::sqrt 不是模板,因此尝试指定模板参数(如 std::sqrt&lt;double&gt;)是不正确的。您也不能显式指定 std::function 构造函数的模板参数(这是 C++ 中的一个语法问题:没有构造函数名称可以将模板参数放在后面)。

    【讨论】:

    • 谢谢!很高兴知道我以正确的方式做到了。第二部分只有一件事,我更多地讨论了模板参数传递给std::function而不是std::sqrt的方式,即std::function&lt; double( double ) &gt;用括号代替CSV。谢谢你的回答!
    • @TheFloatingBrain std::function&lt;double(double)&gt; 是正确的。模板参数是 std::function 对象建模的函数类型。老实说,我认为这是一个糟糕的设计决定(std::function&lt;R, Arg1, Arg2, ...&gt; 会更好),但我们坚持下去。
    • 我觉得语法糖被添加到语言中只是为了std::function 几乎。我还注意到这个解决方案在 MSVC 下工作
    • @TheFloatingBrain 没有语法糖。它只是使用函数类型作为模板参数,这一直是允许的。无论如何,关于 MSVC 问题,我建议写一个 different 问题(并包含完整的错误消息)。就标准 C++ 而言,您最初编写的问题已得到解答。
    • 你能给我一个链接吗?你所说的函​​数类型作为模板参数是什么意思?我有兴趣阅读它。我能想到的最接近的就是在这篇文章的末尾int (*pf)(int)en.cppreference.com/w/cpp/language/template_parametersstd::functiontemplate&lt; class R, class... Args &gt;en.cppreference.com/w/cpp/utility/functional/function?我之所以这么想是因为它看起来像std::function&lt; return_type( argument_type ) &gt;这种语法只是std::function&lt; return_type, argument_type &gt;的另一种说法,是的,你的权利。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-28
    • 1970-01-01
    相关资源
    最近更新 更多