特殊化せずにstdコンテナでtypedefを使用することは可能ですか?
このようなコードは機能します:
typedef std::vector<int> intVector;
しかし、このコードの場合:
template <typename T>
typedef std::vector<T> DynamicArray<T>;
エラーが発生します:
'typedef'のテンプレート宣言
これはC++で行うことができますか?
特殊化せずにstdコンテナでtypedefを使用することは可能ですか?
このようなコードは機能します:
typedef std::vector<int> intVector;
しかし、このコードの場合:
template <typename T>
typedef std::vector<T> DynamicArray<T>;
エラーが発生します:
'typedef'のテンプレート宣言
これはC++で行うことができますか?
はい、C++11 で。
template <typename T>
using DynamicArray = std::vector<T>;
(この正確なエイリアスを使用する必要はありません。)
コンパイラが c++11 をサポートしている場合:
template <typename T>
using DynamicArray = std::vector<T>;
それ以外の場合 (c++98 以前)、次のようなヘルプ構造を使用できます
template<typename T>
struct DynamicArray
{
typedef std::vector<T> type;
};
そしてそれを次のように使用します
DynamicArray<int>::type my_array;
std::vector からの継承は可能な解決策ですが、STL コンテナーには仮想デストラクタがないことに注意してください。すなわち:
template <typename T>
struct DynamicArray: vector<T> { ... };
int main() {
vector<int>* p = new DynamicArray<int>();
delete p; // this is Undefined Behavior
return 0;
}
この構文は C++ では無効です。「テンプレート typedef」のような機能はありません。
template <typename T>
typedef std::vector<T> DynamicArray<T>;
ただし、C++11 では、次のようなテンプレート エイリアス構文が導入されています。
template <typename T>
using DynamicArray = std::vector<T>;
C++03 では、次のようなテンプレート メタ関数を使用できます。
template<class T>
struct DynamicArray
{
typedef std::vector<T> type;
};
一般的な解決策 (C++ 11 を使用していない場合) は、次のようにすることです。
template<class T>
struct DynamicArray
{
typedef std::vector<T> Type;
};
として使用しますDynamicArray<Something>::Type
。