オブジェクトからテンプレートパラメータを取り出す
テンプレートクラスのインスタンスからテンプレートパラメータを取り出したいということが思う。そんなとき以下のようにすると取り出せる。
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(); }
みたいなのがきっかけだ。
実際のところなんに使うのかはわかってない。メタプログラミングとかで役に立つかもしれないし、役に立たないかもしれない。