テンプレートの別名

例えば priority_queue の最小値を返す版って個人的にはわりと使うんですけど、毎回 priority_queue, greater > とか書くの面倒いわけですね。

そんなわけで、パラメータ付き typedef があったら便利だと思った。
↓こんな風に書きたい。

template <class T>
typedef priority_queue<T, vector<T>, greater<T> > Heap<T>;

ML や Haskell だと普通に使える機能ですが、C++ には無い模様。

代替手法として自分でテンプレートを書く場合、短く済ませたいなら継承で

template <class T>
class Heap : public priority_queue<T, vector<T>, greater<T> >
{};

みたいに書く。コンストラクタは再定義しなきゃならないので、一般的には結構面倒なことになるかもしれない。

別の手としては、いっそマクロ使ってしまうというのがある。

#define HEAP(T) priority_queue<T, vector<T>, greater<T> >

HEAP(Hoge) heap;

という感じで、記法上の気持ち悪ささえ妥協すれば割りとうまくいきそうな気がするのだが、

HEAP(pair<int,int>) heap;

がうまくいかない。
原因は、プリプロセッサが間にあるカンマをマクロの引数を分けるカンマだと思ってしまうこと。これを避けるには、

typedef pair<int, int> pair_t;
HEAP(pair_t) hoge;

みたいに分けて書かなきゃならなくて、すごく気持ち悪い。

というわけで、パラメータ含む別名を作るとしたら素直にテンプレート書く方がよさげです。

追記

調べてみると、どうやらそれっぽい機能が C++0x ではサポートされる予定らしい。
↓のような感じで書けるのだとか。

template <class T> using Heap = priority_queue<T, vector<T>, greater<T> >;

というか、ぐぐってみると結構いろんなとこで出ている話題のようですね。