我記得seing這樣的事情正在做:可變長度模板參數列表?
template <ListOfTypenames>
class X : public ListOfTypenames {};
即X從作爲模板參數傳遞typenames的可變長度列表繼承。這個代碼當然是假設的。
我找不到這方面的任何引用,雖然。可能嗎?它是C++ 0x嗎?
我記得seing這樣的事情正在做:可變長度模板參數列表?
template <ListOfTypenames>
class X : public ListOfTypenames {};
即X從作爲模板參數傳遞typenames的可變長度列表繼承。這個代碼當然是假設的。
我找不到這方面的任何引用,雖然。可能嗎?它是C++ 0x嗎?
可以在當前的C++做。你給的模板參數的「足夠大」數量,以及你給他們的默認值:
class nothing1 {};
class nothing2 {};
class nothing3 {};
template <class T1 = nothing1, class T2 = nothing2, class T3 = nothing3>
class X : public T1, public T2, public T3 {};
或者你也可以變得更加複雜和使用遞歸。首先,你向前聲明模板:
class nothing {};
template <class T1 = nothing, class T2 = nothing, class T3 = nothing>
class X;
然後你專注的,所有的參數都是默認的情況下:
template <>
class X<nothing, nothing, nothing> {};
然後你正確定義的通用模板(之前你已經只向前-declared):
template <class T1, class T2, class T3>
class X : public T1, public X<T2, T3>
注意如何在基類,你繼承了X,但你錯過了第一個參數。所以他們都在一個地方滑動。最終它們都將是默認值,並且專業化將會啓動,它不會繼承任何東西,從而終止遞歸。
更新:只是有一種奇怪的感覺,我會發布這樣的事情之前,and guess what...
聽起來像是你指的C++ 0x Variadic Templates。您也可以使用Alexandrescu的的TypeList結構從Loki達到同樣的效果。
我相信,在有關的可變參數模板語法看起來像下面這樣。
template <typename...T>
class X : public T... {};
如果我沒有弄錯,你還需要解壓類型:'public T ... {};'' – UncleBens 2009-10-02 21:12:52
可變數量的模板是下一個C++標準的一部分。但是,如果您使用GCC(從版本4.3開始),您可以體驗它。這是一個list of available C++0x features in GCC。您正在尋找可變數據模板。
順便說一句,如果您需要關於如何實現Earwicker描述的繼承機制的正式參考,請參閱C++ Templates。
正如其他人已經回答了,可變參數模板是一個標準的一部分,但在當前的C++進行仿真。一個便利的工具是使用Boost.MPL庫。在你的代碼中,你編寫了一個模板參數(我們將其命名爲「Typelist」),然後你的模板用戶用MPL序列包裝這個類型列表。示例:
#include "YourType.h"
#include "FooBarAndBaz.h"
#include <boost/mpl/vector.hpp>
YourType<boost::mpl::vector<Foo, Bar, Baz> > FooBarBaz;
在實現「YourType」時,可以使用各種元功能訪問Typelist中的元素。例如,at_c<Typelist, N>
是列表的N
個元素。再舉一個例子,在你的問題中的「X」級可以用inherit_linearly
爲寫:
//Warning: Untested
namespace bmpl = boost::mpl;
template<class Typelist>
class X : bmpl::inherit_linearly<Typelist, bmpl::inherit<bmpl::_1, bmpl::_2> >::type
{
...
};
你也可以只使用一個「無中生有」類 – sellibitze 2009-10-02 20:25:45
@sellibitze - 我只用一個「無」類中遞歸版本。您不能在非遞歸版本中使用相同的類作爲默認值,因爲您會得到「沒有任何東西是直接基類」的錯誤。 – 2009-10-02 20:33:36
我不明白:爲什麼從X繼承時跳過第一個參數? – Gili 2010-07-03 01:27:49