2017-08-01 5 views
0

現在のテンプレートからタイプと値の情報を取得する方法:私はこのようになりますテンプレートクラスを持っている

typedef MyStruct<int, 123> struct_def; 

私は希望:

template<typename T, T value> 
struct MyStruct{ 
    /* Stuff */ 
}; 

は、現在、私はこのような何かを、それをインスタンス化するにはこのような何かやりたい:

MyStruct<int,123>に解決でしょう
typedef typename MagicTemplate<123>::type struct_def; 

を....

私の質問は、どのようにテンプレート引数から型と値の両方の情報を取得できますか?

編集

ソリューションは、ポインタ、メンバへのポインタ、関数ポインタなどで使用することができれば、それはまたいいだろう...

例は:

struct OtherStruct{ 
    int memberA; 
    long memberB; 
    void foo(void); 
}; 
static OtherStruct instance; 


//Expands to MyStruct<memberA OtherStruct::*, &OtherStruct::memberA> 
typedef typename MagicTemplate<&OtherStruct::memberA>::type struct_defA; 
//Expands to MyStruct<OtherStruct*,&instance> 
typedef typename MagicTemplate<&instance>::type struct_defB; 
//Expands to MyStruct<void (OtherStruct::*)(void),&OtherStruct::foo> 
typedef typename MagicTemplate<&OtherStruct::foo>::Type struct_defC; 
+3

[C++ 17](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0127r2.html)のみ。 – Oktalist

+0

@Oktalistああ....それは意味がある...あまりにも悪い私はまだそれを使用することはできません – DarthRubik

+0

私はマクロ(暗い)魔法を推測しています....それは本当に可能でないので... – DarthRubik

答えて

3

あなたはC++ 17を待つことができます。

タイプTとし、Tstd::integral_constantと互換性があると予想されます。これは、道路を一歩進んで缶を蹴る。特定の種類のintegral_constantを作成するためのショートカットは、いくつかのテンプレートインスタンスを作成するものよりもクリーンです。

たとえば、123_kstd::integral_constant<int,123>とすることができます。 MyStruct<decltype(123_k)>

ボーナスとして、MyStructは現在template<class...>と一致しており、特定のメタプログラミングが容易になります。

+0

これは実行可能ですがあなたが興味を持っているすべての単一の型に対して '演算子" "_ k"を定義しなければならないという事実のため、やや不器用です。これは間違いなく改善ですが、ここでは多くの型を扱わなければならないでしょう – DarthRubik

+0

@darthあなたはどんなタイプのものを扱っていますか?私は、大きさは 'size_t'、違いは' ptrdiff_t'、真/偽は 'bool'が普通は私の問題を解決します... – Yakk

+0

また、これはポインタ型では機能しません.....(私がアドレスを知らない限り – DarthRubik

関連する問題