[英]typedefs for templated classes?
是否有可能typedef
使用模板long类型? 例如:
template <typename myfloat_t>
class LongClassName
{
// ...
};
template <typename myfloat_t>
typedef std::vector< boost::shared_ptr< LongClassName<myfloat_t> > > LongCollection;
LongCollection<float> m_foo;
这不起作用,但有没有办法达到类似的效果? 我只想避免键入和读取几乎涵盖编辑器窗口全宽的类型定义。
不,这是目前不可能的。 它将在C ++ 0X AFAIK中成为可能。
我能想到的最好的是
template<typename T> struct LongCollection {
typedef std::vector< boost::shared_ptr< LongClassName<T> > > type;
};
LongCollection<float>::type m_foo;
如果您不想使用宏方式,则必须为每种类型创建单独的typedef:
typedef std::vector< boost::shared_ptr< LongClassName<float> > > FloatCollection;
typedef std::vector< boost::shared_ptr< LongClassName<double> > > DoubleCollection;
不,但你可以使用'帮助'类型来接近,请参阅此示例 。
Leon所展示的解决方案是规范的。 一点背景知识:这被称为“(模板)元函数”,因为它基本上是一个在编译时得到评估的“函数”。 它不是值,而是处理类型:有一个输入类型列表(类型参数),还有一个“返回值”:typedef声明类型名称“type”。
“调用”与普通函数调用类似,尽管语法不同:
// Normal function
result = f(args);
// Metafunction
typedef f<args>::type result;
这个代码构造是库中常用的习惯用法,例如Boost库,甚至在一个地方的STL中: allocator_type::rebind<U>::other
完成同样的事情,唯一的区别是typedef type
被称为other
。
它并不完全符合您的要求,但根据您的实际情况,这可能会达到预期的效果:
template <typename myfloat_t>
class LongClassName
{
// ...
};
template <typename myfloat_t>
class LongCollection : public std::vector< boost::shared_ptr< LongClassName<myfloat_t> > >
{
};
您可能需要根据需要添加一些构造函数或运算符。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.