【问题标题】:C++ typedef for partial templates部分模板的 C++ typedef
【发布时间】:2010-06-08 19:49:55
【问题描述】:

我需要像这样做一个 typedef。

template< class A, class B, class C >
class X
{
};

template< class B, class C >
typedef X< std::vector<B>, B, C >  Y;

我刚刚发现它在 C++ 中不受支持。有人可以建议我如何通过其他方式实现同​​样的目标吗?

谢谢, 悟空。

【问题讨论】:

标签: c++ templates typedef


【解决方案1】:

如果您有 C++0x/C++1x 编译器,则可以使用稍微不同的语法(似乎编译器仍然不支持此功能):

template <typename B, typename C>
using Y = X< std::vector<B>, B, C >;

您可以使用其他技术,例如在模板结构中定义封闭类型(如 Pieter 建议的那样),或滥用继承(尽可能避免):

template <typename B, typename C>
class Y : public X< std::vector<B>, B, C > {};

【讨论】:

  • 这让我想知道 为什么 它还不受支持。它是否比移动语义、auto 打字、可变参数模板或其他一些至少看起来难以实现的东西困难得多?但是我在构建编译器方面没有太多经验,我对事情有多难的直觉可能是方式 :)。
  • 我认为标准的不同部分是在不同的时间决定的——编译器制造商必须有理由相信,在他们花时间开发之前,在最终标准于 2011 年发布之前,一个特性不会改变——然后决定如何适应他们的发布时间表。
  • 我是未来的人。现在主要编译器似乎都支持它。
  • 我看不出第二种解决方案如何滥用继承。它完全符合继承的思想:从一个类派生来创建另一个更专业的类。或者在这种情况下,从一个模板派生以创建更专业的模板。
  • 乍一看,使用 typedef 专门化模板的想法似乎很自然。但事实上,它与 typedef 的想法相矛盾:类型定义。如果类型没有完全定义,那么它就不是 typedef。
【解决方案2】:

通过将其放置在结构中。这个想法被称为 模板别名 并且是 C++0x 标准 (the proposal) 的一部分。但解决方法是:

template<class B, class C>
struct Y {
  typedef X<std::vector<B>, B, C> type;
};

并使用Y&lt;B, C&gt;::type 作为您想要的类型。

你可能倾向于认为 gcc4.5 或 VS2010 可能已经支持它,就像 C++0x 的一个大子集一样,但我不得不让你失望,正如我们所说的那样,它仍然不受支持:) .

【讨论】:

  • 请注意,如果BC 本身是模板参数,则可能需要使用typename 关键字。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-18
  • 1970-01-01
  • 2016-08-23
  • 2017-09-02
相关资源
最近更新 更多