[英]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.