/ / Szablon typedef dla kontenera standardowego (bez specjalizacji)? - c ++, szablony, typedef, specjalizacja szablonów, specjalizacja

Szablon typedef dla kontenera standardowego (bez specjalizacji)? - c ++, szablony, typedef, specjalizacja szablonów, specjalizacja

Czy możliwe jest użycie typedef na std container bez specjalizacji?

Kod taki jak ten działa:

typedef std::vector<int> intVector;

Ale dla tego kodu:

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

Pojawia się błąd:

deklaracja szablonu "typedef"

Można to zrobić w C ++?

Odpowiedzi:

10 dla odpowiedzi № 1

Tak, w C ++ 11.

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

(Nie, że powinieneś używać tego dokładnego aliasu).


6 dla odpowiedzi nr 2

Jeśli twój kompilator obsługuje c ++ 11:

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

w przeciwnym razie (c ++ 98 lub starszym) możesz użyć struktury pomocy, takiej jak poniżej

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

a następnie użyj 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. to znaczy.:

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

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

3 dla odpowiedzi nr 3

Ta składnia jest nieważna w C ++, nie ma takiej funkcji jak "szablon typedef".

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

Jednak C ++ 11 wprowadza składnię aliasu szablonu, która wygląda prawie tak:

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

W C ++ 03 można użyć metafunkcji szablonu, takiej jak:

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

2 dla odpowiedzi № 4

Wspólnym rozwiązaniem (jeśli nie korzystasz z C ++ 11) jest wykonanie tego:

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

I używaj go jako DynamicArray<Something>::Type.