typedefs для шаблонных классов? - PullRequest
       10

typedefs для шаблонных классов?

7 голосов
/ 30 октября 2008

Возможно ли typedef длинные типы, использующие шаблоны? Например:

template <typename myfloat_t>
class LongClassName
{
    // ...
};

template <typename myfloat_t>
typedef std::vector< boost::shared_ptr< LongClassName<myfloat_t> > > LongCollection;

LongCollection<float> m_foo;

Это не работает, но есть ли способ добиться подобного эффекта? Я просто хочу избежать необходимости набирать и читать определение типа, которое охватывает почти всю ширину моего окна редактора.

Ответы [ 5 ]

14 голосов
/ 30 октября 2008

Нет, в настоящее время это невозможно. Это станет возможным в C ++ 0X AFAIK.

Лучшее, что я могу придумать, это

template<typename T> struct LongCollection {
    typedef std::vector< boost::shared_ptr< LongClassName<T> > > type;
};

LongCollection<float>::type m_foo;
3 голосов
/ 30 октября 2008

Если вы не хотите идти по макросу, вы должны сделать индивидуальные определения типов для каждого типа:

typedef std::vector< boost::shared_ptr< LongClassName<float> > > FloatCollection;
typedef std::vector< boost::shared_ptr< LongClassName<double> > > DoubleCollection;
2 голосов
/ 30 октября 2008

Решение, показанное Леоном, является каноническим. Немного базовых знаний: это называется «(функция) метафункция», потому что это в основном «функция», которая оценивается во время компиляции. Вместо значений он работает с типами: есть список типов ввода (аргументы типа) и есть «возвращаемое значение»: typedef, который объявляет имя типа «тип».

«Вызов» работает аналогично обычному вызову функции, хотя и с другим синтаксисом:

// Normal function
result = f(args);

// Metafunction
typedef f<args>::type result;

Эта конструкция кода часто используется в библиотеках, таких как библиотеки Boost, и даже в STL в одном месте: allocator_type::rebind<U>::other выполняет то же самое с той лишь разницей, что typedef type называется other .

2 голосов
/ 30 октября 2008

Нет, но вы можете приблизиться, используя вспомогательный тип, см. пример .

1 голос
/ 30 октября 2008

Это не совсем то, что вы просите, но это может достичь желаемого эффекта в зависимости от вашей реальной ситуации:

template <typename myfloat_t>
class LongClassName
{
    // ...
};

template <typename myfloat_t>
class LongCollection : public std::vector< boost::shared_ptr< LongClassName<myfloat_t> > > 
{
};

Возможно, вам потребуется добавить некоторые конструкторы или операторы в зависимости от ваших потребностей.

...