C++14 以前で関数テンプレートを変数や関数に渡すときにテンプレート型を明示化するのを回避する
前回、C++14 で多相ラムダを使って回避する方法を書いたんですが、ついでに C++14 以前の回避方法も書いてみる。
と、いっても単に関数オブジェクトにするだけですが。
// template<typename T, typename U> // auto // plus(T a, U b){ // return a + b; // } // 関数ではなくてクラスとして定義する struct plus{ template<typename T, typename U> auto operator ()(T a, U b) ->decltype(a + b){ return a + b; } }; // 使用するときはクラスをインスタンス化する auto f = plus{}; f(1, 2); // => 3 f(3.2, -1.4); // => 1.8 // std::bind に渡してみたり using std::placeholders::_1; auto f2 = std::bind(plus{}, 10, _1); f2(3.14); // => 13.14
C++03 時代ではよく使っていたテクニックですね。