2017-11-22 6 views
3

私はSFINAEとおもしろいと私は入力をチェックしようとしています入力は様々なタイプの入力から成っています。 clangによって提供されるエラーはあまり役に立ちません。あなたは何か考えていますか?バリディックテンプレートテンプレートとSFINAE

おかげで他の

struct IsFree 
{ 
}; 

template <typename _Type, typename _State> 
struct Input 
{ 
}; 

template <typename... _Inputs> 
struct Inputs 
{ 
}; 

template <template <typename _Type, typename _State> class, typename... _Inputs> 
struct Inputs<Input<_Type, _State>, _Inputs...> : public Inputs<_Inputs...> 
{ 
}; 

どこか:私は打ち鳴らす-5.0を使用し、-std = Cを取得

auto temp = Inputs<Input<float, IsFree>, Input<float, IsFree>> {}; 

++ 17:

13 : <source>:13:21: error: use of undeclared identifier '_Type' 
struct Inputs<Input<_Type, _State>, _Inputs...> : public Inputs<_Inputs...> 
        ^
13 : <source>:13:35: error: expected a type 
struct Inputs<Input<_Type, _State>, _Inputs...> : public Inputs<_Inputs...> 
           ^
2 errors generated. 
Compiler exited with result code 1 
+1

アンダースコアで始まり大文字で始まる識別子は予約されています。これは宣言するための未定義の動作です。 ['[lex.name]/3.1']のルール(http://eel.is/c++draft/lex.name#3.1)。 – YSC

+4

** SFINAE **、SNIFAEではありません。置換の失敗はエラーではありません。 – Constructor

答えて

7
template <template <typename _Type, typename _State> class, typename... _Inputs> 
struct Inputs<Input<_Type, _State>, _Inputs...> : public Inputs<_Inputs...> 
{ 
}; 

をする必要があります

パターン Input<_Type, _State>で210
template <typename _Type, typename _State, typename... _Inputs> 
struct Inputs<Input<_Type, _State>, _Inputs...> : public Inputs<_Inputs...> 
{ 
}; 

あなたはワイルドカードとテンプレートテンプレートパラメータを一致させる必要がある場合_Typeと_stateだけでワイルドカードを入力している、あなただけのtemplate <typename, typename> class Fテンプレートテンプレートパラメータの構文を必要とします。この場合は、テンプレートを入力と呼ばれる既知のテンプレートと照合しています

6

最後のケースの部分的な特殊化が正しくありません。 _Type_Stateを推測する必要がありますが、テンプレートテンプレートパラメータはありません。

template <class _Type, class _State, typename... _Inputs> 
struct Inputs<Input<_Type, _State>, _Inputs...> : public Inputs<_Inputs...> 
{ 
}; 

元のコードでは、テンプレートテンプレートパラメータ内の名前は、その部分的な特殊化のテンプレートパラメータを導入しません。

また、アンダースコアと大文字で始まる名前は実装に予約されているので、独自のコードで使用しないでください。

+0

私が使用するアンダースコアについて言及します。実装とは何ですか? – sylvain

+0

@sylvainコンパイラと標準ライブラリ。 – TartanLlama

+0

慣習はありますか? _はとても便利です。 – sylvain

0

すでに他人から提供されている完璧な回答以外に、あなたの期待される結果がInputs<Input<float, IsFree>, int, Input<int, IsFree>>のようなタイプのものであると尋ねることができますか?真ん中に浮遊intがあることに注目してください。現在の例のように、基本クラスの再帰を最初の非Input<>引数で停止するか、コンパイルエラーがありますか?

後者は、私のようなので、不完全な型であることを、一般的なInputsテンプレート定義を変更した後、ゼロテンプレート引数の場合には、空の構造体のために特化した提案する可能性がある場合:

// General case, incomplete type 
template<class... T> 
struct Inputs; 

// Special case for zero arguments, empty struct 
template<> 
struct Inputs<> 
{ 
}; 

を一緒にあなたとInputs<Input<*,*>, ...>の特殊化を使用すると、Input<*,*>のリストではない引数を使用してテンプレートをインスタンス化することはできません。

+0

私はコンパイルの失敗を解決するために全体の小さなサンプルを提供しました。しかし、私のコードで処理する終了事例がたくさんあるのは事実です。 – sylvain