templateを使って、ある型Hogeが来たら対応する型Fugaを返すといったような型のマッピングが
したいんですが、複雑で柔軟なマッピングがしたいです。

//型のマッピングをしてくれる構造体。Tを与えるとtypeにマッピングされた型が定義される
template<typename T>
struct type_map{
  typedef なにか type;
};

という構造体があったとして、「なにか」の部分をうまいことして単純な1対1対応のマッピングだったり
「あるクラスの派生型ならこの型」というような継承関係を利用した多対1のマッピングだったり
マッピングの定義箇所がソース上で何箇所かに分かれていたり(例えば、返したい型の定義されているヘッダ)
こういうことをしたいんですが、何か方法はありますか?

C+