定義に対する通常の引数を超えて、マクロを使用してこの関数をどのように記述しますか?
template <typename IterType>
typename IterType::value_type Sum(
const IterType& begin,
const IterType& end,
const IterType::value_type& initialValue)
{
typename IterType::value_type result = initialValue;
for (IterType i = begin; i != end; ++i)
result += i;
return result;
}
....
vector<int> values;
int sum = Sum(values.begin(), values.end(), 0);
これは明らかに些細な例ですが、その関数は、加算を実装する型の前方反復可能なシーケンスを合計できます*。このように使用されるTypedefは、Generic Programmingの重要な要素です。
*私はこれをここに書いただけで、読者のためのエクササイズとしてコンパイルしておきます:-)
編集:
この答えは多くの混乱を引き起こしているように思われるので、もっと詳しく説明させてください。STLベクトルの定義の内部を見ると、次のようなものが表示されます。
template <typename ValueType, typename AllocatorType>
class vector
{
public:
typedef ValueType value_type;
...
}
標準コンテナ内でtypedefを使用すると、汎用関数(上記で作成した関数など)がこれらの型を参照できます。関数「Sum」はstd::vector<int>
、コンテナ内に保持されているタイプ()ではなく、コンテナのタイプ()にテンプレート化されていint
ます。typedefがなければ、その内部型を参照することはできません。
したがって、typedefはModern C ++の中心であり、これはマクロでは不可能です。