2012-09-03

C++11参考書でのVariadic Templatesを使ったクラスのうまい例が思いつかない

今書いているC++11のコア言語の参考書では、原則としてC++11の文法と機能だけを解説し、その利用方法については範疇ではないという方針だ。しかし、Variadic Templatesに関しては、利用例も説明したほうがいいのではないかと思った。とくに、任意個の実引数を汎用的に扱う方法だけは、説明しておいた方がいいだろう。

function parameter packで汎用的なコードを書くために再帰を使う方法は、もちろん説明するとして、問題は、その利用例だ。関数の場合は、短い実用的な例がいくつも挙げられる。たとえば、単純に実引数を全部、標準出力に出力するといったものや、二つ以上の任意個の実引数を取り、最小あるいは最大の値を返す関数、minやmaxの実装などだ。

しかし、Variadic Templatesクラステンプレートとなると、うまい利用例が思いつかない。というのも、真面目に実装しようとすると、やたらと複雑なテンプレートメタプログラミングの技法が出てくるからだ。もちろん、テンプレートメタプログラミングとしては初歩的な技法に過ぎないのだが、その技法を知らないとわけがわからない。しかし、その技法を解説するのは、やはりそれ専用の本を別に書くべきだ。

いちばんわかりやすいのは簡易的なtupleだ。任意個の実引数をコンストラクターで取ってクラスのデータメンバーとして格納するのは簡単だが、何番目かを指定して取り出すgetの実装が、やたらと長ったらしくなってしまう。メタプログラミングとしては初歩的なものなのだが、やはりメタプログラミングの解説書ではない以上、これを載せるのはどうかと思う。

functionもわかりやすい例だが、やはり実装は長ったらしくなる。

実装自体は、純粋なコア言語の知識だけで書けるので、非常に美しいのだが。

追記:書きなおしてみると、tupleのgetは完結に書けることが判明した。そういえば、規格にtupleのコンパイル時イテレーターとか実行時for_eachがないのはなぜだろう。

No comments: