2010-06-08 27 views
15

Potrzebuję zrobić typedef w ten sposób.C++ typedef dla częściowych szablonów

template< class A, class B, class C > 
class X 
{ 
}; 

template< class B, class C > 
typedef X< std::vector<B>, B, C > Y; 

Po prostu stwierdziłem, że nie jest obsługiwane w C++. Czy ktoś może mi doradzić, jak osiągnąć to samo poprzez alternatywne środki?

Dzięki, Gokul.

+1

możliwe duplikat (http typedef matrycy [?]: // stackoverflow .com/questions/649718/templated-typedef) – Troubadour

Odpowiedz

18

Jeśli masz C++ 0x/C++ 1x kompilator, że będzie mógł z nieco innej składni (wydaje się, że nie kompilatory nadal obsługiwać tę funkcję):

template <typename B, typename C> 
using Y = X< std::vector<B>, B, C >; 

można stosować inne techniki, jak definiowanie zamknięty w matrycy typu struktury (jak sugeruje Pieter) lub nadużywanie dziedziczenia (unikać, jeśli to możliwe):

template <typename B, typename C> 
class Y : public X< std::vector<B>, B, C > {}; 
+1

Zastanawiam się jednak * dlaczego * nie jest jeszcze obsługiwany. Czy jest to o wiele trudniejsze niż przenoszenie semantyki, pisanie "auto", szablony variadic lub inne rzeczy, które przynajmniej wydają się trudne do wdrożenia? Ale nie mam dużego doświadczenia w budowaniu kompilatora, moja intuicja na temat tego, jak ciężko może być * droga * wyłączona :). – Pieter

+2

Myślę, że różne części standardu zostały ustalone w różnym czasie - twórcy kompilatorów muszą być dość pewni, że funkcja nie ulegnie zmianie, zanim ostateczny standard zostanie wydany w 2011 roku, zanim poświęcą czas na jej opracowanie - i wtedy zdecydować, w jaki sposób pasuje ona do do ich harmonogramów wydań. – AshleysBrain

+0

Jestem osobą przyszłości. Wydaje się, że jest teraz obsługiwany w większych kompilatorach. – imallett

15

Umieszczając go w strukturze. Pomysł ten nosi nazwę alias szablonu i jest częścią standardu C++ 0x (the proposal). Ale obejście jest dana przez:

template<class B, class C> 
struct Y { 
    typedef X<std::vector<B>, B, C> type; 
}; 

i używać Y<B, C>::type jako pożądanego typu.

Być może myślisz, że gcc4.5 lub VS2010 mogą już go obsługiwać, tak jak ma to miejsce w przypadku dużego podzbioru C++ 0x, ale muszę Cię rozczarować, ponieważ wciąż mówimy, że nie jest obsługiwany:).

+2

Pamiętaj, że może to wymagać użycia słowa kluczowego 'typename', jeśli' B' lub 'C' są same parametrami szablonu. –