2017-09-29 3 views
3

내가 좋아하는 일을하고 싶은 다음 (C++ 11에서 C++ (14),하지 C++ 17) :템플릿 기반 typedef에서 템플릿 전문화를 사용할 수 있습니까?

template <class T> 
using partner = void; 

template<> 
using partner<A> = X; 

template<> 
using partner<B> = Y; 

template<> 
using partner<C> = Z; 

하지만 컴파일 오류가 발생 ---

error: expected unqualified-id before ‘using’

--- 첫 번째 템플릿 전문화 과정입니다.

그런 것이 가능합니까? (나는 이미 그 안에 using 문을 가진 템플릿 클래스를 사용할 수 있다는 것을 알고있다. 클래스 래퍼없이 using 문을 직접 사용하기를 바란다. 좀 더 간단하고 우아하기 때문에.

+0

'표준 : conditional_t'를 얻을 수 있습니다 : : is_same')이 대안이지만, 나는 그것이 더 우아하다고 말하지 않을 것이다. – Jarod42

+1

그런 일을 할 수없는 이유 중 하나는 별칭 템플릿이 컨텍스트로 추론된다는 것입니다. 다른 템플릿 매개 변수에서 사용되는 경우 –

답변

10

별칭 템플릿을 특수화 할 수 없습니다.

당신은 클래스 템플릿 특수화 지루한 정상에 의지해야합니다 :

template <class T> struct partner_t { using type = void; }; 
template <> struct partner_t<A> { using type = X; }; 
template <> struct partner_t<B> { using type = Y; }; 
template <> struct partner_t<C> { using type = Z; }; 

template <class T> 
using partner = typename partner_t<T>::type; 

또는 우리가 표준`으로 (애호가

template <class T> struct tag { using type = T; }; 

template <class T> auto partner_impl(tag<T>) -> tag<void>; 
auto partner_impl(tag<A>) -> tag<X>; 
auto partner_impl(tag<B>) -> tag<Y>; 
auto partner_impl(tag<C>) -> tag<Z>; 

template <class T> 
using partner = typename decltype(partner_impl(tag<T>{}))::type; 
관련 문제