2017-09-29 118 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

'的std :: conditional_t'(用'STD: :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;