我需要进行类似于这样的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。
我需要进行类似于这样的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。
如果你拥有一个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 > {};
typedef
不定义类型,它在 C 语言中不是这样,在 C++ 中也不是这样,它只是创建一个别名,因此最后一条评论中的理由是站不住脚的。答案中继承的使用真的是滥用。继承是语言(许多语言)中最常被滥用的特性。在那里使用继承并不会创建一个可替换基类的类型,而是一个语法快捷方式,以免输入。问题太多了,无法在评论中列出,但从构造函数(必须转发)开始,到析构函数(X 的析构函数是否虚拟?)结束。 - David Rodríguez - dribeas通过将它放在结构体中。这个想法称为模板别名,是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的大部分子集一样,但我必须让您失望,现在它仍然不被支持 :)
B
或C
本身是模板参数,则可能需要使用typename
关键字。 - Matthieu M.