标准容器的模板类型定义(无专用化)

Template typedef for std container (without specialization)?

本文关键字:专用 定义 类型 标准      更新时间:2023-10-16

是否可以在 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++中无效,没有像"模板类型定义"这样的功能。

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.