代码之家  ›  专栏  ›  技术社区  ›  YSC

使用重载集中的特定函数调用函子

  •  4
  • YSC  · 技术社区  · 5 年前

    上下文

    在与数学相关的上下文中,我想定义处理函数的函子 <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);
    }
    

    如果这是不可能的,有没有办法定义一个函子,使其具有重载集意识?

    2 回复  |  直到 5 年前
        1
  •  7
  •   NathanOliver    5 年前

    我知道最简单的方法是使用lambda来启用重载查找

    std::invoke([](auto val){return std::sin(val);}, 0.0);
    

    invoke 然后lambda主体将处理实际调用,然后将出现重载解析。

    援引

    #define FUNCTORIZE(func) [](auto&&... val) noexcept(noexcept(func(std::forward<decltype(val)>(val)...))) -> decltype(auto) {return func(std::forward<decltype(val)>(val)...);}
    //...
    std::invoke(FUNCTORIZE(std::sin), 0.0);
    
        2
  •  3
  •   peppe    5 年前

    如何从重载集中命名特定函数?

    static_cast . 例如。

    std::invoke(static_cast< double(*)(double) >( &std::sin ), 0.0);
    

    std::invoke([](auto x){ return std::sin(x); }, 0.0);
    

    在Qt中,我们遇到了一个相当困难的问题,就是获取重载函数的地址,直到 helpers 已经介绍了。我讨论了这样一个助手的可能实现 here .

    本标准的规范性参考文件 用法是 here