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 時代ではよく使っていたテクニックですね。