非型のテンプレート引数と非型のテンプレート パラメーターを使用して、型をテンプレートに分解できるテンプレートを作成したいと考えています。たとえば、andに分解Array<5>
されますが、非型テンプレート パラメーターの任意の型 (整数型、ポインター、メンバー ポインターなど) に対して一般的に機能します。template<int> Array
5
テンプレートの特殊化を使用して、最初に試してください。
template<typename T> struct foo { enum { n = 1 }; };
template<int x> struct bar { enum { n = x }; };
template<typename T, template<T> class X, T x>
struct foo< X<x> > { enum { n = x }; }; // here x must be of integral type, but that's just for testing
int main(int, char**) { return foo< bar<16> >::n; }
Clang 3.1 は次のように述べています。
test145.cpp:6:8: warning: class template partial specialization contains a template parameter that can not be deduced; this partial specialization will never be used
struct foo< X<x> > { enum { n = x }; };
^~~~~~~~~~~
test145.cpp:5:19: note: non-deducible template parameter 'T'
template<typename T, template<T> class X, T x>
^
1 warning generated.
関数テンプレートを使用した 2 回目の試行:
template<typename T, T x>
struct box
{
static constexpr T value() { return x; }
};
template<typename T, template<T> class X, T x>
box<T, x> foo(X<x>);
template<int> struct asdf { };
int main(int, char**) { return decltype(foo(*(asdf<9>*)0))::value(); }
クランは次のように述べています。
test150.cpp:12:41: error: no matching function for call to 'foo'
int main(int, char**) { return decltype(foo(*(asdf<9>*)0))::value(); }
^~~
test150.cpp:8:11: note: candidate template ignored: couldn't infer template argument 'T'
box<T, x> foo(X<x>);
^
1 error generated.
GCC 4.7 も同様のことを言っています。
これは基本的な制限ですか?
おまけの質問: そうだとすれば、有限の量のコードで無限の可能性をすべて処理する方法はありますか? (たとえばポインタでは難しくなります。あなたが書けないように見えるのと同じ理由で、あなたもtemplate<T>
書けないと思いますtemplate<T*>
。)
なぜ私が尋ねているのか聞かないでください。