2015-10-14 18 views
11

binary_functionが廃止され、C++で削除される予定です17。私は異なる出版物を検索しましたが、それを置き換える正確な方法を見つけることができませんでした。私はどのようにC++ 11スタイルで次のコードを書くべきか知っておきたいと思います。binary_functionの代わりに

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); 
    } 
}; 

EDIT:ループ

+2

あなたがそれを必要とする理由?declutypeは 'binary_function'の必要なしに' operator() 'の型を調べることができます –

+2

これらのテンプレート関数をどのように使いますか?答えは用途によって異なります。 – Rostislav

+1

http://stackoverflow.com/a/22863957/642626どのように呼び出し可能オブジェクトの引数と戻り値の型を見つけるか。 –

答えて

7

まず、私の助言は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はargument_typeの/ etc必要なときにC++ 98-時代 アダプタ便利なヘルパーでした。 typedefs。そのようなtypedefsは、 であり、C++ 11の完璧な転送、宣言型などは不要です。 (これらはoverloaded/templated関数呼び出し の演算子には適用できません)クラスがこれらの型定義を後方互換性のために提供したいとしても、unary_functionから継承するのではなく、直接的に( 控え目で)これらのヘルパー が推奨されなくなったときに、Standard自体が何をしていたのかは、/ bin/function_です。

これで必要ないので、プログラムからすべての痕跡を削除できます。

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<>()); 
+0

うまく動作します!リンクも非常に便利です。 – Luis

8

std::binary_functionが提供されない唯一のもののために内部で、

output[j] = *std::max_element(input.begin() + prev, input.begin() + pos, absoluteLess<float>()); 

入力と出力はベクトルです:私は、次のように関数を使用してい メンバtypedef result_type,first_argument_type、およびsecond_argument_typeです。そして、これらのtypedefを使用する標準ライブラリの唯一のものは、std::not2です。これは、1)厳密にはC++に置き換えられています。17 std::not_fn、2)ラムダで簡単に置き換えられる、3)C++で廃止予定17次のリビジョンで削除されます。何らかの理由で、あなたがnot2を使用する必要がある、場合

、従来のバインダー(bind1st/bind2ndは、両方のは、C++ 11で非推奨となり、C++ 17で除去される)、またはいくつかの古代のサードパーティ製のものは、そのプロトコルを以下の代わりに、クラス内で直接typedefを定義することができます。

using result_type = bool; 
using first_argument_type = T; 
using second_argument_type = T; 

それ以外の場合は、継承を削除します。