2017-11-22 6 views
3

SFINAE와 (과) 놀고있어 내 입력을 확인하려고합니다. 다양한 유형의 입력으로 이루어져 있습니다. clang이 제공 한 오류는별로 도움이되지 않습니다. 너는 어떤 생각을 가지고 있니?Variadic 템플릿 템플릿 및 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++ 17 얻을

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

:

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...> 
{ 
}; 

요구하는 것이 될

당신이 와일드 카드 템플릿 템플릿 매개 변수와 일치해야하는 경우 _Type 및 _state 그냥 와일드 카드를 입력하는 패턴 Input<_Type, _State>에서
template <typename _Type, typename _State, typename... _Inputs> 
struct Inputs<Input<_Type, _State>, _Inputs...> : public Inputs<_Inputs...> 
{ 
}; 

(210)는, 당신은 단지 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

관련 문제