C++でtemplate typedef

C++でtypedefをtemplate化してやりたい. 例えば単純に

#include <map>

typedef std::map<std::string, std::string> string_map_type; /// これはOK

template<typename Tkey_, typename Tvalue_>
typedef std::map<Tkey_, Tvalue_> my_map_type; /// これはエラー

という感じ. 後者の記法はC++0xではサポート予定らしいがなんにせよ今は動かない. 回避策としてはmetafunctionを使うのが得策っぽい.

template<typename Tkey_, typename Tvalue_>
struct my_map_type_generator
{
  typedef std::map<Tkey_, Tvalue_> type;
};

typedef my_map_type_generator<std::string, std::string>::type string_map_type;

http://d.hatena.ne.jp/uskz/20071028/p1
http://www.boost.org/community/generic_programming.html#type_generator

metafunction嫌いとしてはちょっと嫌なのだが. というか同じ問題にあたった人じゃないとこの実装に納得しないと思われる.

他に継承で回避しちゃう手もあるらしいがあまり気持ち良くない. コンストラクタの再定義も必要らしいし.

template<typename Tkey_, typename Tvalue_>
class my_map_type
  : public std::map<Tkey_, Tvalue_>
{
  ; // define constructors here
};

http://d.hatena.ne.jp/blanketsky/20071027/1193488871

もっと直観的な方法としてdefineマクロを使うという手がありますが, 名前空間が適用されないし, ちょっとありえません.

http://www.geocities.jp/ky_webid/cpp/language/018.html

#define my_map_type(Tkey_, Tvalue_) std::map<Tkey_, Tvalue_>
typedef my_map_type(std::string, std::string) string_map_type;

どうかしてるぜ!

http://msdn.microsoft.com/ja-jp/library/cc440199%28v=vs.71%29.aspx