template引数を置換するテンプレートを考えてみた

#include<iostream>
#include<typeinfo>
template <typename T> struct replace_holder{template <typename TYPE> struct replace;};

#define regist_replace_holder(base) \
template<typename T> struct replace_holder< base<T> > \
{ \
template <typename TYPE> struct replace \
{typedef base<TYPE> type;}; \
};
#define replace_temp_arg(from,arg) replace_holder< from >::replace<arg>::type

template <typename T> struct temp1{};
regist_replace_holder(temp1);

int main()
{std::cout << typeid( replace_temp_arg(temp1<int>,double) ).name() << std::endl;}