std::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, 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>());
input
とoutput
はstd::vector
sで、forループ内にあります。
まず、私のアドバイスは、CppCon 2015:Stephan T. Lavavejの「機能:新機能と適切な使用法」をご覧になることです。std::binary_function
スライド36のビデオの約36分に記載されています。スライドはgithub.com/CppCon/CppCon2015にあります)。使用すべきでない理由については詳しく説明してstd::binary_function
いませんが、C ++ 11以降廃止されたものを使用している場合は、それを見るとおそらくメリットがあります。
それを使用しない実際の理由が必要な場合は、n4190を試してください。
unary_function / binary_functionは、C ++ 98時代のアダプターがargument_type / etcを必要とするときに役立つヘルパーでした。typedefs。このようなtypedefは、C ++ 11の完全な転送、decltypeなどを考えると不要です。(そして、オーバーロード/テンプレート化された関数呼び出し演算子には適用できません。)クラスが下位互換性のためにこれらのtypedefを提供したい場合でも、unary_function / binary_functionから継承する代わりに、直接(冗長性のわずかなコストで)提供できます。これらのヘルパーが非推奨になったときに、Standard自体が実行を開始したことです。
今、あなたはそれを単に必要としないので、あなたはあなたのプログラムからそれのすべての痕跡を取り除くことができます。
C ++ 14では、透過コンパレータが追加されました。ただし、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<>());
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加