【问题标题】:How to typedef a template class? [duplicate]如何 typedef 模板类? [复制]
【发布时间】:2011-10-17 22:38:17
【问题描述】:

我应该如何 typedeftemplate class ?比如:

typedef std::vector myVector;  // <--- compiler error

我知道两种方法:

(1) #define myVector std::vector // not so good
(2) template<typename T>
    struct myVector { typedef std::vector<T> type; }; // verbose

我们在 C++0x 中有什么更好的吗?

【问题讨论】:

  • 我正在实施一些涉及template class 的事情。最初,我将使用标准类来实现它,然后我想转移到我制作的自定义类。所以我希望该开关应该像更改 typedef 一样简单。
  • 我必须同意大卫的观点。为什么要给它起别名?间接性是导致代码不可读和不可维护的主要原因。但是,您确实给出了一个很好的理由,“抽象”。 stl 的问题在于 API。它会阻止特定的优化。保持相同的 API 并认为你可以做得更好是命运多舛的。编写自己的可增长数组不需要一整天。做它并完成它。或者只是使用 STL 并继续你的生活。
  • 宏实现有什么问题?
  • @Strin,技术上没有问题。只是宏不是namespace/class 绑定的。它们是无限的。如果有人想将他们的变量命名为myVector,这是无法做到的。
  • 这是非常糟糕的礼仪,IMO,问一些事情,回答你为什么想做某事,然后像@Dan 所做的那样,向提问者解释他们为什么错了。我的意思是,人们应该怎么做?分享他们的整个内部设计文件,向你解释他们正在做一些有效的事情?这完全没有建设性。

标签: c++ templates c++11 typedef


【解决方案1】:

是的。它被称为“alias template”,是 C++11 中的一个新特性。

template<typename T>
using MyVector = std::vector<T, MyCustomAllocator<T>>;

然后使用将完全符合您的预期:

MyVector<int> x; // same as: std::vector<int, MyCustomAllocator<int>>

GCC 从 4.7 开始支持它,Clang 从 3.0 开始支持,MSVC 在 2013 SP4 中支持。

【讨论】:

  • 这很酷,但我无法用我的 gcc4.6 或 4.5 (ideone.com/I8kbA) 验证它。你在用 MSVC 编译吗?
  • 您必须先等待 C++0x 被接受。然后你必须等待编译器编写者真正实现标准。
  • "问题是还没有人支持它。"几个月以来它就在 clang (svn trunk) 中。
  • 如果不明显,这在 MSVC10SP1 中不起作用
  • 这不适用于 MSVC 2012,但适用于 MSVC 2013 SP4。
【解决方案2】:

在 C++03 中,您可以从一个类(公共或私有)继承来这样做。

template <typename T>
class MyVector : public std::vector<T, MyCustomAllocator<T> > {};

您需要做更多的工作(特别是复制构造函数、赋值运算符),但这是可行的。

【讨论】:

  • @iammilind:赞成而不是保护反对反对只会让他们更有可能(这个问题是如何被赞成的!类型的推理)。我是公开反对从 STL 容器继承的人之一……但在这种情况下,没有那么多选择。我想最好的选择是重新考虑你为什么要首先这样做......
  • @David Rodriguez 同意您为什么要这样做。但是,如果您大量使用基于另一个分配器的向量,那么模板类型定义将非常受欢迎。虽然私有继承(即按条款实现)对我来说很好,但前提是有理由从它继承......通常没有。
  • 也许不适用于 std::vector,但总的来说我可以看到它很方便。假设您有一个类型,例如 LongName (或一长串嵌套模板);那么有一个快捷方式名称可能会很方便。如果您将此类型用于一个或两个不同的 T,那么您可以对它们进行 typedef。但是如果你有很多类型T,那么typedef它们都可以只要直接使用名称,但使用名称很长。
猜你喜欢
  • 2011-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多