【问题标题】:Supertype of std::plus and std::minus / how can I use std::plus and std::minus in a single object?std::plus 和 std::minus 的超类型 / 如何在单个对象中使用 std::plus 和 std::minus?
【发布时间】:2022-08-12 23:44:37
【问题描述】:

我试图通过删除仅在+=-= 中不同的冗余代码来简化一段代码。我的想法是改用std::plusstd::minus,从而将这两种方法合二为一。

最少的代码是:

#include <functional>
int main()
{
    // true is actually some condition
    std::binary_function<long, long, long> direction = true ? std::plus<long>() : std::minus<long>();  
}

错误是

错误 C2446: \':\': 没有从 \'std::minus\' 到 \'std::plus\' 的转换

我不想将 std::minus 转换为 std::plus,我想将所有内容都转换为 std::binary_function。

我试图帮助编译器使用静态转换

std::binary_function<long, long, long> direction = true 
     ? static_cast<std::binary_function<long, long, long>>(std::plus<long>()) 
     : std::minus<long>();

这给了我

错误 C2440:\'static_cast\':无法从 \'std::plus\' 转换为 \'std::binary_function<long,long,long>\'

长问题短:如何在单个对象中使用 std::plus 和 std::minus ?

在 Visual Studio 中使用 C++14,但也对较新的 C++ 版本中的解决方案开放。

    标签: c++ stl


    【解决方案1】:

    继承自std::binary_function&lt;T, T, T&gt;was removed in C++11。另外,std::binary_functionchanged in C++11 and changes in C++17 again

    您可以改用function

    std::function<long(long, long)> direction = true
        ? static_cast<std::function<long(long, long)>>(std::plus<long>())
        : std::minus<long>();
    

    您可以通过在操作中省略类型并使用auto 来简化更多操作:

    auto direction = true
        ? static_cast<std::function<long(long, long)>>(std::plus())
        : std::minus();
    

    【讨论】:

      猜你喜欢
      • 2020-08-17
      • 1970-01-01
      • 2022-10-25
      • 1970-01-01
      • 2020-10-29
      • 1970-01-01
      • 2012-11-02
      • 1970-01-01
      • 2021-05-24
      相关资源
      最近更新 更多