標準ライブラリ関数オブジェクトの通常のパターンは、テンプレート化された構造体に非テンプレートを使用することoperator()
です。たとえば、std::less
次のようになります。
template <typename T>
struct less
{
bool operator()(const T& lhs, const T& rhs) const {
return lhs < rhs;
}
};
std::vector<float> vec = ...;
std::sort(vec.begin(), vec.end(), less<float>{});
私の質問は、なぜこれがテンプレート化された非テンプレート構造体よりも優れているのoperator()
ですか? 上記のファンクターは、次の操作と同等であるように思われます。
struct less2
{
template <typename T>
bool operator()(const T& lhs, const T& rhs) const {
return lhs < rhs;
}
};
std::vector<float> vec = ...;
std::sort(vec.begin(), vec.end(), less2{});
ただし、自動型控除のボーナスが得られます。さらに良いことに、必要に応じて、異なるタイプを比較することもできます。
struct less
{
template <typename T, typename U>
bool operator()(const T& lhs, const U& rhs) const {
return lhs < rhs; // compile error if operator<(T, U) is not defined
}
};
そしてそこから、たとえばdecltype
真に汎用的な を取得するために使用する方法は明らかです。std::plus
しかし、標準ライブラリはそのようにはしません。
もちろん、私はこれが最初に起こった人ではなく、標準化委員会が 2 番目ではなく 1 番目のパターンを採用することを決定した非常に正当な理由があると確信しています。私はそれが何であるか分かりません。教祖の誰かが私を啓発することができますか?