2017-12-15 47 views
5

필자는 입력 포트를 만들도록 템플릿을 작성하려고합니다. 이는 단일 입출력 포트 또는 입력 핀 목록에서 수행 할 수 있습니다. 그 이름이 같은 템플릿을 선호합니다. 나는 입출력 포트와 입력 핀 모두에 대한 개념을 가지고있다. 쓸 수 있습니다C++ 템플릿은 하나의 유형 또는 다른 단일 유형의 목록과 일치 할 수 있습니까?

template< typename... arguments > 
struct port_in .... 

template< pin_in T > 
struct port_in<> .... 

그러나 이제 목록 버전은 모든 유형을 허용합니다. 구현에서이를 확인할 수 있지만 적합하지 않은 유형을 전달할 때 사용자가받는 오류 메시지가 저하됩니다. 어떻게 든 목록을 한 유형으로 제한 할 수 있지만 다른 유형의 단일 템플릿 매개 변수는 허용 할 수 있습니까? 나는 그것이 비의 정수를 사용할 수있는 경우이 작업을 수행하는 깨끗한 방법이 확실하지 않다

template<uint16_t ... Ports> 
struct port_in .... 

을하면 실제 원하는 : 목록의 버전 번호를 취할 것으로 예상되는 경우

답변

4

당신은 사용자가 항상 적절한 오류 메시지를 얻을 수 있도록하려는 경우, 그럼 당신은 기본 템플릿을 제한 할 필요가있다. 다음과 같이 기존의 개념이 InputPinInputOutputPort 명명 된 가정하면, 입력 핀의 순서 또는 단일 입력/출력 포트를 허용하도록 기본 템플릿을 제한 할 수 있습니다 :

template<class... Ts> 
concept bool AllInputPins = (InputPin<Ts> && ...); 

template<class... Ts> 
concept bool OneInputOutputPort = sizeof...(Ts) == 1 && (InputOutputPort<Ts> && ...); 

template <class... Args> 
    requires AllInputPins<Args...> || OneInputOutputPort<Args...> 
struct port_in { 
    // ... 
}; 
+0

이것은 좋아 보인다. 나는 내일 그것을 시험 할 것이다. 제가 빠뜨린 것은 개념을 받아들이는 능력이었습니다. –

+0

'concept'은 비표준입니다. – SergeyA

+0

예,하지만 개념을 사용하고 있습니다. 질문에 'C++ 개념'이라는 태그가 붙어 있으며 질문 문안에 개념을 언급합니다. –

1

당신은 그것을 만들 수 (모든 인수가 같은 유형이어야 함). 당신은 모든 유형이 동일해야 수 있다면 난 당신이 뭔가를 할 수 있다고 생각 :

template<typename T, std::enable_if_t<T> * = nullptr> 
struct port_in_base{}; 
template<typename T, T ... ports> 
struct port_in : port_in_base<T> .... 
+0

'나는 깨끗한이 확실하지 않다 만약 당신이 실제 타입리스트를 원한다면'std :: integral_constant' 나 equivalent를 전달하는 것입니다. –

+0

템플릿 파라미터는 정수가 아닌 모든 클래스입니다. –