C++部分模板的typedef

19

我需要进行类似于这样的typedef。

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

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

我刚发现这在C++中不受支持。有人能向我提供如何通过其他方式实现相同效果的建议吗?

谢谢, Gokul。


1
可能是[templated typedef ?]的重复问题 (https://dev59.com/fXRB5IYBdhLWcg3wWGEH)。 - Troubadour
2个回答

22

如果你拥有一个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 > {};

1
让我感到好奇的是,为什么它还没有得到支持。难道它比移动语义、自动类型推导、可变参数模板或其他一些看起来很难实现的东西更难吗?但我在构建编译器方面没有太多经验,我的直觉可能完全错误 :)。 - Pieter
2
我认为标准的不同部分是在不同的时间内决定的——编译器制造商必须相当有信心,在2011年最终标准发布之前,某个功能不会发生变化,然后决定如何将其纳入到他们的发布计划中。 - AshleysBrain
1
我是未来的人。现在似乎在主流编译器中得到了支持。 - geometrian
我不明白第二种解决方案如何滥用继承。它恰好符合继承的概念:从一个类派生出另一个更专业的类。或者在这种情况下,从一个模板派生出一个更专业的模板。 - orodbhen
1
乍一看,使用typedef专门化模板的想法似乎很自然。但实际上,它与typedef的概念相矛盾:类型定义。如果类型没有完全定义,那么它就不是typedef。 - orodbhen
@orodbhen:typedef 不定义类型,它在 C 语言中不是这样,在 C++ 中也不是这样,它只是创建一个别名,因此最后一条评论中的理由是站不住脚的。答案中继承的使用真的是滥用。继承是语言(许多语言)中最常被滥用的特性。在那里使用继承并不会创建一个可替换基类的类型,而是一个语法快捷方式,以免输入。问题太多了,无法在评论中列出,但从构造函数(必须转发)开始,到析构函数(X 的析构函数是否虚拟?)结束。 - David Rodríguez - dribeas

15

通过将它放在结构体中。这个想法称为模板别名,是C++0x标准的一部分(提案)。但有一个解决方法:

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

使用Y<B, C>::type作为您所需的类型。

您可能会倾向于认为gcc4.5或VS2010已经支持它,就像C++0x的大部分子集一样,但我必须让您失望,现在它仍然不被支持 :)


2
请注意,如果BC本身是模板参数,则可能需要使用typename关键字。 - Matthieu M.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接