| Home | Libraries | People | FAQ | More

# Function Object Traits

functional.hpp ヘッダは関数と関数オブジェクトのための、二つの特性クラステンプレート を提供します:

Type | Contents | Description
--- | --- | ---
`template <typename T> struct unary_traits` | `function_type` | 関数や関数オブジェクト自身の型 (例えば `T`)。
`param_type` | 関数や関数オブジェクトをパラメータとして渡すために 使われるべき型。
`result_type` | 関数や関数オブジェクトの返り値の型。
`argument_type` | 関数や関数オブジェクトの引数の型。
`template <typename T> struct binary_traits` | `function_type` | 関数や関数オブジェクト自身の型 (例えば `T`)。
`param_type` | 関数や関数オブジェクトをパラメータとして渡すために 使われるべき型。
`result_type` | 関数や関数オブジェクトの返り値の型。
`first_argument_type` | 関数や関数オブジェクトの第一引数の型。
`second_argument_type` | 関数や関数オブジェクトの第二引数の型。

### Usage

`unary_traits` は一引数を取る関数と適合一引数関数 オブジェクト (例えば `std::unary_function` を継承した クラス) や、同様の typedef がなされたクラス)のどちらかとともに実体化され なければならない。(C++ 標準の §20.3.1 を参照せよ)

`binary_traits` は二引数を取る関数と適合二引数関 数オブジェクト (例えば `std::binary_function` を継承し たクラス) や、同様の typedef がなされたクラス)のどちらかとともに実体化さ れなければならない。(C++ 標準の §20.3.1 を参照せよ)

これらのテンプレートのもっとも一般的な使い方は、関数オブジェクトアダ プタ内で、関数オブジェクトと同様に普通の関数を適合させることである。普段 例えば、

>     typename Operation::argument_type

と書く所ならどこでも、代わりに

>     typename boost::unary_traits<Operation>::argument_type

と書くだけで良い。

### Additional Types Defined

標準の返り値と引数の typedef に加えて、これらの特性テンプレートは 二つの型を定義する。

#### `function_type`

これは関数や関数オブジェクトの型である。そして、宣言の中で以下のよう に使われる。

>     template <class Predicate>
>     class unary_negate : // ...
>     {
>       // ...
>       private:
>         typename unary_traits<Predicate>::function_type pred;
>     };

もしこの typedef が無ければ、`unary_negate`を関数 型とともにインスタンシエイトさせることができる方法で、`pred`を宣 言することはできないだろう。(C++ 標準の §14.3.1 ¶3 を参照せよ)

#### `param_type`

これは関数や関数オブジェクトを他の関数に引数として渡すのに最適な型で ある。

>     template <class Predicate>
>     class unary_negate : // ...
>     {
>       public:
>         explicit unary_negate(typename unary_traits<Predicate>::param_type x)
>             :
>             pred(x)
>         {}
>         // ...
>     };

関数オブジェクトは定数参照で渡され、関数ポインタは値渡しされる。

### Limitations

このライブラリは全てのアダプタ関数オブジェクトでこれらの特性を利 用していて、理論的には、`ptr_fun`を廃止されるように する。しかし、サードパーティのアダプタは多分このメカニズムを利用しない だろうし、`ptr_fun`は未だ必要である。このライブラリ は標準関数ポインタアダプタの改善バージョンを提供する。

これらの特性テンプレートも、テンプレートの部分特殊化版を提供できないコ ンパイラでは動かないだろう。これらのコンパイラでは、特性テンプレートは適 合関数オブジェクトでのみ実体化され、このライブラリの関数オブジェクトとも もに用いる場合でさえ、`ptr_fun`を使う必要があるだろ う。

Copyright © 2000 Cadenza New Zealand Ltd. Permission to copy, use, modify, sell and distribute this document is granted provided this copyright notice appears in all copies. This document is provided "as is" without express or implied warranty, and with no claim as to its suitability for any purpose.

Revised 28 June 2000

Japanese Translation Copyright (C) 2003 shinichiro.h <g940455@mail.ecc.u-tokyo.ac.jp>.

オリジナルの、及びこの著作権表示が全ての複製の中に現れる限り、この文書の 複製、利用、変更、販売そして配布を認める。このドキュメントは「あるがまま」 に提供されており、いかなる明示的、暗黙的保証も行わない。また、 いかなる目的に対しても、その利用が適していることを関知しない。