読者です 読者をやめる 読者になる 読者になる

C++1y - 2項演算関数オブジェクトをよりジェネリックに

C++

ヘッダで定義されている、std::less, std::greater, std::plusといった関数オブジェクトは、クラステンプレートになっていて、そのテンプレートパラメータで内部で扱う型を受け取ります。


しかし、その型は関数テンプレートのアルゴリズム内で決定されることが多いため、クラスのテンプレートパラメータになっていると、アルゴリズムのユーザーコード側で型を入力しないといけないので、少々使いにくいです。

std::vector<int> v = {3, 1, 4};

std::sort(v.begin(), v.end(), std::greater<int>()); // ここでintは書きたくない

C++1yでは、これらの関数オブジェクトを改良し、関数呼び出し演算子をテンプレートにしよう、という提案が出ています。

std::vector<int> v = {3, 1, 4};

std::sort(v.begin(), v.end(), std::greater<>());

改良案としては、以下のようになっています:

  • これらの関数オブジェクトにvoidの特殊化バージョンを用意する
  • voidバージョンは関数呼び出し演算子にテンプレートを使う
  • クラステンプレートのパラメータをデフォルトでvoidにする


これが入らないと、多相ラムダが導入されると同時にこれらの関数オブジェクトがいらない子になってしまうので、なんらかの形で入るでしょう。


N3421 Making Operator Functors greater<>