Наследование вместо typedef - PullRequest
11 голосов
/ 14 января 2009

C ++ не может сделать шаблон из typedef или typedef шаблонного класса. Я знаю, что если я унаследую и сделаю свой класс шаблоном, он будет работать.

Примеры:

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

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

Является ли это полезным, чтобы я мог "подделать" typedef или есть лучшие способы сделать это?

Ответы [ 4 ]

13 голосов
/ 14 января 2009

C ++ 0x добавит определения типа шаблона по ключевому слову using.

Ваше решение объявляет новый тип, а не тип "псевдоним", например Вы не можете инициализировать MyVectorType & (ссылка) с vector<T>. Это не может быть проблемой для вас, но если это так, но вы не хотите ссылаться на вектор в своем коде, вы можете сделать:

template <typename T>
class MyVectorType {
public:
  typedef std::vector<T> type;
};
10 голосов
/ 14 января 2009

Наследование не то, что вы хотите. Более идиоматический подход к эмуляции шаблонного typedef заключается в следующем:

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

Обратитесь к typedef следующим образом:

MyVectorType<T>::t;
1 голос
/ 14 января 2009

C ++ не может сделать шаблон из typedef или typedef шаблонного класса.

Это зависит от того, что вы подразумеваете под typedef: std::vector<size_t> допустимо - даже если size_t является typedef - и std::string является typedef для std::basic_string<char>.

0 голосов
/ 31 июля 2018

Что вы должны использовать, зависит от его поведения (например, разрешение перегрузки):

  • Если вы хотите, чтобы это был новый отдельный тип

    class Foo : public Whatever {};
    

    Однако теперь вы можете передавать указатели или ссылки Foo функциям, принимающим Whatever, так что это становится гибридом. Поэтому в этом случае используйте private наследование и using Whatever::Foo или пользовательские реализации, чтобы предоставить нужные вам методы.

  • Если вы хотите синоним типа

    using Foo = Whatever;
    

Преимущество первого в том, что можно предварительно объявить класс, но не typedef.

...