オブジェクトからテンプレートパラメータを取り出す

テンプレートクラスのインスタンスからテンプレートパラメータを取り出したいということが思う。そんなとき以下のようにすると取り出せる。

template<typename T,template<typename>class Target>
T getType(Target<T>);

template<typename T>
class Hoge{};


int main(){
	Hoge<int> hoge;
	decltype(getType(hoge)) a = 0;
}

getType関数では関数テンプレートの推論機能を使ってテンプレートパラメータTを取り出している。そして返り値の型がTになるのであとはdecltypeで型にしてしまえばめでたく取り出せるという方針だ。

とか書いたもののもともと考えていたのはHaskellの文脈に値を入れるという考え方が面白いなーと思って

#include<iostream>

template<int N,template<int>class Target>
Target<2*N> twice(const Target<N>&);


template<int N>
struct Context{
	
	void draw(){
	std::cout << N <<std::endl;
	}

};

int main(){
	Context<3> context;

	decltype(twice(context)) context2;
	
	context2.draw();

}

みたいなのがきっかけだ。
実際のところなんに使うのかはわかってない。メタプログラミングとかで役に立つかもしれないし、役に立たないかもしれない。