C++ template地獄


私は、大晦日からお正月の4日間、まるごと使ってC++のtemplateを駆使して書かれたプログラムをいじり倒していただけという、とんでもないお正月だった。気がついたら4日が過ぎていた。


そのソースを書いたのは東大の人で、凄く洗練された素晴らしいプログラムではあるのだけど、困ったことにモジュール性が恐ろしく低い。


Visual C++はtemplateに関してはinclusion-modelを採用している。実体化したいtemplateの実装はheaderに書かなければならない。


headerは、その実装のために必要なheaderをincludeする。そのincludeされたheaderもまたtemplateで書かれているので芋づる式に他のファイルを読み込んでいく。


私はそのプログラムのごく一部のclassを流用したかっただけなのだけど、芋づるがひどすぎて切り離せない。


さらに悪いことに、オブジェクト指向プログラムにおいては、ひとつのclassにそのclassに関する操作をすべて詰め込んでしまおうとする傾向がある。そのプログラムもご多分に漏れずそうなっていて、ひとつのclassが凄い数のmethodを持っている。そのmethodがまたtemplateなもんだから、その実装がheaderに書いてあってと…気が遠くなるようなソースだった。


C#ではpartial classがあるので、このようなことにはならないが、C++で、AOPが出来ない場合、templateをここまで多用するなら、classにはmethodをあまり持たせるべきではないと思う。つまり、Cで擬似的にOOPしようとしていたあのころのように、

	hoge.HogeClassMethod();

ではなく、

namespace Hoge
{
	void HogeClassMethod (const HogeClass& hoge);
}

みたいな形でHogeClassのmethodを用意して

	Hoge::HogeClassMethod(hoge);

のように呼び出して使ったほうがいいような気はする。(わかんないけど)


もはや全然オブジェクト指向っぽくないけど、行き過ぎると原点回帰するっていうのはなんだか面白い。