继承而不是typedef

时间:2009-01-14 02:45:07

标签: c++ inheritance templates typedef

C ++无法使用typedef创建模板或者键入模板化模板。我知道如果我继承并使我的班级成为模板,它将会起作用。

示例:

// Illegal
template <class T>
typedef MyVectorType vector<T>;

//Valid, but advantageous?
template <class T>
class MyVectorType : public vector<T> { };

这样做有利于我可以“伪造”一个typedef或者有更好的方法来做到这一点吗?

4 个答案:

答案 0 :(得分:13)

C ++ 0x将使用using关键字添加模板typedef。

您的解决方案声明了一种新类型,而不是类型“别名”,例如您无法使用MyVectorType &初始化vector<T>(引用)。这对您来说可能不是问题,但如果是,但您不想在代码中引用向量,则可以执行以下操作:

template <typename T>
class MyVectorType {
public:
  typedef std::vector<T> type;
};

答案 1 :(得分:10)

继承不是你想要的。模仿模板化typedef的更惯用的方法是:

template <typename T> struct MyVectorType {
    typedef std::vector<T> t;
};

请参阅类似的typedef:

MyVectorType<T>::t;

答案 2 :(得分:1)

  

C ++无法使用typedef创建模板或者键入模板化的类。

这取决于typedef的含义:std::vector<size_t>是合法的 - 即使size_t是typedef - std::stringtypedef std::basic_string<char>

答案 3 :(得分:0)

您应该使用什么取决于它的表现方式(例如过载分辨率):

  • 如果您希望它是一种新的独特类型

    class Foo : public Whatever {};
    

    但是,您现在可以将Foo的指针或引用传递给接受Whatever的函数,因此这成为一种混合形式。因此,在这种情况下,请使用private继承和using Whatever::Foo或自定义实现来公开所需的方法。

  • 如果您想输入类型同义词

    using Foo = Whatever;
    

前者的优点是可以预先声明一个类,而不是typedef。