5

Czy można używać typedef na pojemniku standardowym bez specjalizacji?Szablon typedef dla kontenera standardowego (bez specjalizacji)?

kod jak to działa:

typedef std::vector<int> intVector; 

Ale dla tego kodu:

template <typename T> 
typedef std::vector<T> DynamicArray<T>; 

pojawia się błąd:

template declaration of 'typedef'

Jest możliwe, aby to zrobić w C++ ??

+0

Biorąc pod uwagę, że wszystko, co zasadniczo robisz, zmienia nazwę 'std :: vector', jak niefortunne byłoby użycie' #define DynamicArray std :: vector'? – suszterpatt

+0

@sterterpatt - prawda, ale staram się zachować nowoczesność i unikać używania niebezpiecznych makr :) – dtech

Odpowiedz

9

Tak, w C++ 11.

template <typename T> 
using DynamicArray = std::vector<T>; 

(Nie, że należy użyć dokładnie ten alias.)

+0

Wygląda na to, że nie działa w Visual Studio 2010 SP1. Otrzymuję "nierozpoznawalną deklarację/definicję szablonu" Przypuszczam, że nie jest jeszcze obsługiwana przez MS? – dtech

+1

@ddriver: Nie, nie jest. A także przez VC11, AFAIR. Jeśli chcesz C++ 11, użyj GCC lub Clang. –

+0

Znalazłem obejście dla VS po prostu dziedzicząc wektor. Proszę zobaczyć odpowiedź, którą dodałem i rzucić trochę światła, jeśli nie jest to dobry pomysł. Dzięki! – dtech

2

Wspólne rozwiązanie (jeśli nie używasz C++ 11) jest w tym celu:

template<class T> 
struct DynamicArray 
{ 
    typedef std::vector<T> Type; 
}; 

i używać go jako DynamicArray<Something>::Type.

6

Jeśli wsparcie kompilator C++ 11:

template <typename T> 
using DynamicArray = std::vector<T>; 

inaczej (C++ 98 lub starsze) można użyć struktura pomaga jak poniżej

template<typename T> 
struct DynamicArray 
{ 
    typedef std::vector<T> type; 
}; 

a następnie użyć go jako

DynamicArray<int>::type my_array; 

Dziedziczenie z std :: vector jest możliwym rozwiązaniem, ale należy pamiętać, że kontenery STL nie mają wirtualnego destruktora. tj .:

template <typename T> 
struct DynamicArray: vector<T> { ... }; 

int main() { 
    vector<int>* p = new DynamicArray<int>(); 
    delete p; // this is Undefined Behavior 
    return 0; 
} 
+0

Tak, ale dlaczego miałbym dynamicznie przydzielać wektor, gdy korzysta on z dynamicznego przydzielania pamięci dla jego danych wewnętrznie? – dtech

+0

Ponadto, nie mogę sam napisać destruktora, myślę, że destruktor wektora powinien być odpowiedzialny za jego dane, muszę tylko zająć się dodatkowymi rzeczami, które dodałem. Mogę się mylić, nie jestem zbyt dobry w C++. – dtech

+0

Mam na myśli, że mogą istnieć problemy z polimorficznym użyciem, ale ponieważ celem jest użycie klasy pochodnej, nie sądzę, że będą jakieś problemy z powodu braku wirtualnego destruktora. Mam na myśli to, że nie mam zamiaru wywoływać delete na wskaźniku do wektora, który faktycznie wskazuje na DynamicArray, która również nie ma żadnych dodatkowych dynamicznie przydzielonych członków wymagających dodatkowej opieki. Proszę, popraw mnie jeśli się mylę. Dzięki! – dtech

3

Ta składnia jest niepoprawna w C++, nie ma takiej cechy jak "szablon typedef".

template <typename T> 
typedef std::vector<T> DynamicArray<T>; 

Jednak C++ 11 wprowadza składni szablonu alias, który jest prawie tak:

template <typename T> 
using DynamicArray = std::vector<T>; 

w C++ 03 można użyć szablonu metafunkcji jak:

template<class T> 
struct DynamicArray 
{ 
    typedef std::vector<T> type; 
}; 
0

Aby dodać własne rozwiązanie do mieszaniny

Ponieważ funkcja C++ 11 nie jest obsługiwana przez program Visual Studio, postanowiłem po prostu dziedziczą std :: vector, używając tego dodać kilka funkcji:

template <typename T> 
class DynamicArray : public std::vector<T> { 
public: 
    DynamicArray& operator<<(const T& value) 
    { 
     push_back(value); 
     return *this; 
    } 
}; 

Teraz oprócz push_back, łańcuchowym rozwiązywane są także:

DynamicArray<int> array; 
array << 1 << 2 << 3 << 4 << 5 << 6; 

ja nie wiem, czy takie podejście może mieć niezamierzone wady , więc jeśli wiesz o czymś, podziel się nimi!

+1

Dziedziczenie ze standardowych kontenerów ma pewne wady ... (konf. Moja odpowiedź) Czy rozważałeś wprowadzenie zamiast tego darmowych funkcji? 'DynamicArray & operator << (const DynamicArray & arr, const T i value)' – log0