typedef template?
templateのパラメータを2つ持っているクラスがあるとして、
そのうち1つだけを決めてもう片方をtemplateパラメータとして残しておきたい
ということがありました。
template<class A, class B> class Foo .....
template<typename T> typedef Foo<int, T> IntegerFoo; // IntegerFoo<string> のように使用する(したい)
template<typename T> typedef Foo<int, T> IntegerFoo; // IntegerFoo<string> のように使用する(したい)
ところがこれできないんですね。。。あちこちでC++の規格に追加してよと提案されてはいるようですが。
というわけで、今回はtypedefするのではなくて、派生クラスを定義して同じことを実現しました。
template<typename T> class IntegerFoo : public Foo<int, T> {};
ただこの手法はもちろんFooが派生可能であるということが前提です。
調べてみると他にもいろいろなアプローチがあるようです。
MSDN Deep C++ Typedef Templates
3 コメント:
へぇー, 不便ですなぁ.
.NETでもWhidbeyでテンプレートが追加されるけどその辺はどうなってんだろね.
ところで, どんなときに,
template class Foo
なんて定義したくなんのかな?
ライブラリを作ってると、
「汎用的にするためにテンプレートパラメータをいくつかつけたけど、とあるパラメータはほとんどこのケースでしか利用しないから、ユーザーにいちいち指定させるのは面倒。よく使うテンプレートパラメータを最初から与えたaliasを用意しておこう」
ということがあったので、template typedefが必要になりました。
用意したいaliasが1つならデフォルトのtemplateパラメータを与えることでできるけど、複数のaliasを作りたい場合はtemplate typedefになるね。
ライブラリは作るもんじゃねえ!使うもの(笑)
コメントを投稿