2014-11-10 14 views
6

Zwykłe elemencie szablonu można specjalistycznej, npużyciu specjalizację szablonu

template<typename T> 
struct X{}; 

template<> 
struct X<int>{}; 

C++ 11 dał nam nową zimną składni using do wyrażania typedefs Szablon:

template<typename T> 
using YetAnotherVector = std::vector<T> 

Czy istnieje sposób, aby zdefiniować specjalizację szablonów dla tych przy użyciu konstruktów podobnych do specjalizacji dla szablonów struct? Próbowałem następujące:

template<> 
using YetAnotherVector<int> = AFancyIntVector; 

, ale przyniósł błąd kompilacji. Czy to w jakiś sposób jest możliwe?

+2

AFAIK, potrzebujesz do tego klasy backendu. Ukryj wyspecjalizowaną "strukturę", a następnie utwórz alias przy użyciu tej klasy. – chris

+0

Nie jestem pewien, czy śledzę, co jest nie tak z 'typedef YetAnotherVector AFancyIntVector'? – slaphappy

+0

@ Mr.kbok: Używanie wyciągu razem z używaniem powoduje błąd kompilacji "wiele typów w jednej deklaracji" – gexicide

Odpowiedz

7

nr

Ale można zdefiniować alias jako:

template<typename T> 
using YetAnotherVector = typename std::conditional< 
            std::is_same<T,int>::value, 
            AFancyIntVector, 
            std::vector<T> 
            >::type; 

nadzieję, że pomoże.

+0

'std :: conditional' teraz kopnął mój tyłek tyle razy, że straciłem rachubę. – chris

+1

Może dlatego, że ma * złe * imię. 'if_else' (lub' if_c') byłoby lepsze? – Nawaz

+0

Oh wow, to brzydkie, haha: D – Quentin

1

Nie można ich wyspecjalizować w sposób jawny ani częściowo. [Temp.decls]/3:

Ze względu na to ps deklaracja nie wskaże szablonu-id jest nie można częściowo lub wyraźnie specjalizują się szablon aliasu.

Będziesz musiał odłożyć specjalizacje do szablonów klas. Na przykład. z conditional:

template<typename T> 
using YetAnotherVector = std::conditional_t< std::is_same<T, int>{}, 
              AFancyIntVector, 
              std::vector<T> >; 
+1

Jeśli używasz C++ 14, możesz także uniknąć pisania części ':: value', ponieważ' std :: is_same {} 'jest krótszy! – Nawaz

+0

@Nawaz Nie zależy mi tylko na krótkości, ale również na jasności. W każdym razie, jeśli ludzie uznają to za czytelne, będę odpowiednio edytować kod – Columbo

+0

Umm, zależy ci na krótkości, dlatego napisałeś '_t' wersję' std :: conditional'. – Nawaz

Powiązane problemy