2018年02月23日
《その307》 単項ファンクタ
単項ファンクタ
<functional>ヘッダで提供される単項ファンクタ logical_not<> は、
1個の仮引数を受け取ります。
logical_not<> の定義例
template <class T> struct logical_not
: unary_function<T, bool> {
bool operator()(const T& x) const {
return !x;
}
};
: unary_function<T, bool> {
bool operator()(const T& x) const {
return !x;
}
};
この定義例からわかるように、単項ファンクタ logical_not<> は、
unary_function<> の派生クラステンプレートとして定義されています。
前回の《306》で、2項ファンクタは、標準ファンクタであれば、すべて、
binary_function<> の派生クラステンプレートとして定義されていると、書きました。
標準ファンクタに限らず、自作のファンクタ等の場合でも、
・単項ファンクタは unary_function<> の派生クラステンプレートとして定義し、
・2項ファンクタは binary_function<> の派生クラステンプレートとして定義する
のが一般的、ということです。
次のコードは、unary_function<> の定義例です。
template <class Arg, class Result>
struct unary_function {
typedef Arg argument_type;
typedef Result result_type;
};
したがって、例えば logical_not<int> クラスでは、次の typedef名が使用できます。
argument_type
result_type
#include <functional>
#include <iostream>
using namespace std;
int main() {
cout << logical_not<int>()(3 < 2) << '\n';
cout << logical_not<int>()(3 > 2) << "\n\n";
cout << typeid(
logical_not<int>::
argument_type
).name()
<< '\n';
cout << typeid(
logical_not<int>::
result_type
).name()
<< '\n';
}
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/7353231
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック