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

LokiはC++0xから流行ると思う

C++

LokiはPolicy-based Designのライブラリとして有名ですが、
その設計にはテンプレート・テンプレート・パラメータを多用されています。


C++03の段階では以下のようなテンプレート・テンプレート・パラメータを用意しても

template <template <class T> class Container>
class X {
    Container<int> cont_;
};

std::vectorを渡すとエラーになってしまい

X<std::vector> x; // エラー!

std::vectorのテンプレートパラメータとパラメータ数を合わせるために
以下のようにアロケータを受け取るためのパラメータを追加しないといけません。

template <template <class T, class Alloc=std::allocator<T> > class Container>
class X {
    Container<int> cont_;
};

X<std::vector> x; // OK

なので、C++03時点でのテンプレート・テンプレート・パラメータはけっこう使いにくいです。




C++0xの可変引数テンプレートはテンプレート・テンプレート・パラメータに対しても使用することができるので以下のような簡単な定義だけで済みます。

template <template <class... Args> class Container>
class X {
    Container<int> cont_;
};

これだけ用意しておけば、std::vectorをXのテンプレートパラメータとして渡すことができますし

X<std::vector> x; // OK

以下のようなアロケータの型を受け取らないシンプルなコンテナでも渡すことができます。

template <class T>
class Vector {
    ...
};

X<Vector> x; // OK

なので、Policy-based Designは、可変引数テンプレートの導入によってテンプレート・テンプレート・パラメータが強化されるC++0xになってから流行ると思います。



【参考】

Template Template Parameters

Variadic Template Template Parameters使ってみた