7

是否可以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;

这不起作用,但是有没有办法达到类似的效果?我只是想避免键入和阅读几乎覆盖了我的编辑器窗口整个宽度的类型定义。

4

5 回答 5

14

不,目前不可能。这将在 C++0X AFAIK 中实现。

我能想到的最好的是

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

LongCollection<float>::type m_foo;
于 2008-10-30T19:34:19.190 回答
3

如果您不想采用宏方式,则必须为每种类型制作单独的 typedef:

typedef std::vector< boost::shared_ptr< LongClassName<float> > > FloatCollection;
typedef std::vector< boost::shared_ptr< LongClassName<double> > > DoubleCollection;
于 2008-10-30T19:36:01.230 回答
2

不,但是您可以使用“助手”类型来接近,请参阅此示例

于 2008-10-30T19:36:33.490 回答
2

Leon 给出的解决方案是规范的。一点背景知识:这被称为“(模板)元函数”,因为它基本上是一个在编译时被评估的“函数”。它处理类型而不是值:有一个输入类型列表(类型参数)和一个“返回值”:声明类型名称“type”的 typedef。

“调用”的工作方式类似于正常的函数调用,尽管语法不同:

// Normal function
result = f(args);

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

这种代码结构是 Boost 库等库中甚至在 STL 中的一个常用习惯用法:allocator_type::rebind<U>::other完成相同的事情,唯一的区别type是调用typedef other

于 2008-10-30T19:43:24.240 回答
1

它并不完全符合您的要求,但这可能会根据您的实际情况达到预期的效果:

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

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

您可能需要根据需要添加一些构造函数或运算符。

于 2008-10-30T19:41:09.673 回答