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); } };
编辑:
我以下列方式使用这些功能:
output[j] = *std::max_element(input.begin() + prev,input.begin() + pos,absoluteLess<float>());
输入和输出是一个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以来已被弃用的东西,那么你可能会从观看中受益.
如果你想要实际的理由不使用它,请尝试n4190:
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.
现在你根本不需要它,所以你可以从程序中删除它的所有痕迹.
在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)); } } };
现在可以推导出这个类型:
std::max_element(v.begin(),v.end(),absoluteLess<>());