c – 替换binary_function

前端之家收集整理的这篇文章主要介绍了c – 替换binary_function前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
binary_function现在已被弃用,将在C 17中被删除.我在不同的出版物上进行了搜索,但是我找不到一个准确的替代方法.我想知道如何使用C 11风格编写以下代码.
template <class T>
inline T absolute(const T &x) {
    return (x >= 0) ? x : -x;
}

template <class T>
struct absoluteLess : public std::binary_function<T,T,bool> {
    bool operator()(const T &x,const T &y) const {
        return absolute(x) < absolute(y);
    }
};

template <class T>
struct absoluteGreater : public std::binary_function<T,bool> {
    bool operator()(T &x,T &y) const {
        return absolute(x) > absolute(y);
    }
};
@H_404_4@编辑:
我以下列方式使用这些功能

output[j] = *std::max_element(input.begin() + prev,input.begin() + pos,absoluteLess<float>());
@H_404_4@输入和输出是一个for循环中的向量

解决方法

首先,我的建议是观看 CppCon 2015: Stephan T. Lavavej “functional: What’s New,And Proper Usage”. std :: binary_function在幻灯片36上提到,大约在36分钟的视频.您可以在github.com/CppCon/CppCon2015找到幻灯片.它不详细为什么你不应该使用std :: binary_function,但如果你使用自从C 11以来已被弃用的东西,那么你可能会从观看中受益. @H_404_4@如果你想要实际的理由不使用它,请尝试n4190:

@H_404_4@unary_function/binary_function were useful helpers when C++98-era
adaptors needed argument_type/etc. typedefs. Such typedefs are
unnecessary given C++11’s perfect forwarding,decltype,and so forth.
(And they’re inapplicable to overloaded/templated function call
operators.) Even if a class wants to provide these typedefs for
backwards compatibility,it can do so directly (at a minor cost in
verbosity) instead of inheriting from unary_function/binary_function,
which is what the Standard itself started doing when these helpers
were deprecated.

@H_404_4@现在你根本不需要它,所以你可以从程序中删除它的所有痕迹.

@H_404_4@在C14中,增加了透明比较.但它可以在C 11中实现.只是专门为void:

template<>
struct absoluteLess<void> {
    template< class T,class U>
    constexpr auto operator()( T&& lhs,U&& rhs ) const
      -> decltype(absolute(std::forward<T>(lhs)) < absolute(std::forward<U>(rhs)))
    {
        return absolute(std::forward<T>(lhs)) < absolute(std::forward<U>(rhs));
    }
}
};
@H_404_4@现在可以推导出这个类型:

std::max_element(v.begin(),v.end(),absoluteLess<>());

猜你在找的C&C++相关文章