Нет, это в настоящее время не возможно. Это будет сделано возможным в C++ 0X AFAIK.
Лучшее, о котором я могу думать,
template<typename T> struct LongCollection {
typedef std::vector< boost::shared_ptr< LongClassName<T> > > type;
};
LongCollection<float>::type m_foo;
Нет, но можно быть рядом с помощью типа 'помощника', видеть этот пример.
Если Вы не хотите идти макро-путем, необходимо сделать отдельные определения типов для каждого типа:
typedef std::vector< boost::shared_ptr< LongClassName<float> > > FloatCollection;
typedef std::vector< boost::shared_ptr< LongClassName<double> > > DoubleCollection;
Решение, показанное Leon, является каноническим. Бит фонового знания: Это называют “(шаблон) метафункцией”, потому что это - в основном “функция”, которая оценена во время компиляции. Вместо значений это имеет дело с типами: существует список входных типов (аргументы типа) и существует “возвращаемое значение”: определение типа, которое объявляет имя типа “тип”.
“Вызов” работает аналогично к нормальному вызову функции, хотя с другим синтаксисом:
// Normal function
result = f(args);
// Metafunction
typedef f<args>::type result;
Эта конструкция кода является часто используемой идиомой в библиотеках, таких как библиотеки Boost и даже в STL в одном месте: allocator_type::rebind<U>::other
выполняет то же самое с единственной разницей что определение типа type
назван other
.
Не точно, что Вы просите, но это могло бы достигнуть желаемого эффекта в зависимости от Вашей фактической ситуации:
template <typename myfloat_t>
class LongClassName
{
// ...
};
template <typename myfloat_t>
class LongCollection : public std::vector< boost::shared_ptr< LongClassName<myfloat_t> > >
{
};
Вы, возможно, должны добавить некоторых конструкторов или операторы в зависимости от Ваших потребностей.