2017-11-25 7 views
0

非型テンプレートパラメータをテンプレートクラスに関数テンプレートを特化:私は今、関数テンプレートvalidateType()C++ - 私はクラステンプレートはFoo持っ

template <class T> 
bool validateType() { 
    return false; 
} 

を持って

template <class A, A value, class B> 
class Foo {}; 

とをI関数がコンパイル時にいくつかのstatic_assertsを実行するように、Fooを含むいくつかの型に対して特殊化したいとします。私はこれを試してみました:

template <class A, class B, Foo<A, A val, B>> 
bool validateType() { 
    // do some static asserts 
} 

と、この:最初の一

template <class A, A val, class B> 
bool validateType<Foo<A, val, B>>() { 
    // do some static asserts 
} 

、コンパイラは言う:

error: wrong number of template arguments (2, should be 3) 
template <class A, class B, Foo<A, A val, B>> 
              ^~ 
note: provided for ‘template<class A, A value, class B> class Foo’ 
class Foo {}; 
     ^~~ 
error: two or more data types in declaration of ‘validateType’ 
bool validateType() { 
       ^
error: expected ‘>’ before ‘{’ token 
bool validateType() { 
        ^

第2の場合には、私は

error: non-class, non-variable partial specialization ‘validateType<Foo<A, val, B> >’ is not allowed 
bool validateType<Foo<A, val, B>>() { 
           ^
を取得します

これはどのように行うべきですか?

答えて

1

部分テンプレート特殊化は、関数テンプレートには使用できません。
使用SFINAEまたはクラステンプレート

template <class T> 
struct validateType : std::false_type {}; 

template <class A, A val, class B> 
struct validateType<Foo<A, val, B>> : std::true_type {}; 
関連する問題