2013-10-23 53 views
3

的是否有可能在ANY方法有類型的載體(DEF)S IN C++一十四分之一十一向量的typedef

我想的第一件事是有一個基類的載體並以某種方式得到它的派生形式的類型定義,但我不能得到這個工作,無論我嘗試(不可能的最有可能的)。

僞C++:

class base 
{ 
    /* somehow access 'type' from derived */ 
} 

template <typename T> 
class derived : base 
{ 
    typedef T type; 
} 

vector<base*> vec; 
vec.push_back(new derived<int>); 
vec.push_back(new derived<double>); 
vec.push_back(new derived<float>); 
vec.push_back(new derived<string>); 

for(auto& item : vec) 
    static_cast< item->type >(/* something */); 
+1

不,這聽起來像你需要一個智能指針或引用包裝的向量(我會建議這兩個前者)。但你仍然需要知道派生類型,甚至要求它。 – WhozCraig

+0

你想要完成什麼?我可以做'類SomeClass; typedef SomeClass X; std :: vector v;'沒有問題。 – rwols

+1

您是否正在尋找[Boost.MPL](http://www.boost.org/doc/libs/1_54_0/libs/mpl/doc/index.html)或[Boost.Fusion](http:/ /www.boost.org/doc/libs/1_54_0/libs/fusion/doc/html/index.html)? – Angew

回答

3

升壓MPL提供了一個編譯時構建這種情況,例如:

typedef boost::mpl::vector<int, double, std::string, CustomA, CustomB> seq_of_types; 

可以與此在編譯類型使用組廣泛的在MPL定義的元功能進行交互。還有一些運行時交叉功能。這裏很重要的一點是,這是類型的序列,不存在要與互動每種類型的任何實例。即使運行時功能也只允許與類型進行交互。

加速融合(和std::tuple)在這裏的步驟,以提供運行時異質容器,因此,例如

boost::fusion::vector<int, double, std::string> v{10, 100., "Foo"}; 

現在在編譯時,您可以訪問每個條目類型的信息,並在運行時你在序列中有每個類型的實例。

有可能你試圖實現可以用普通的繼承來完成,而不必訴諸於上面,所以向量持有一個指向基類的指針,它具有一個在派生中被重寫的虛函數這些類可以做你想做的事。這可能是最乾淨的。

替代地,同樣是可能的,而不求助於使用繼承如果使用可變參數類型boost::variant,例如:

std::vector<boost::variant<int, double, std::string>> entries; 

現在,每個條目是類型int之一,doublestd::string。然後在迭代時,可以使用靜態訪問者對特定實例進行操作。我想我前段時間回答了一個關於這個問題的問題。

那它會是什麼?

編輯:根據你最後的評論,然後後者(變體)不真正飛,平原繼承也沒有。我認爲融合向量並不是必需的,因爲您不需要每種類型的實例。爲您提供最合適的東西,然後就是mpl::vector,並使用運行時函數mpl::for_each

2

不,你不能。 C++中的類型不是對象,它們不能用作值。

根據你的實際需要,你也許能type_info做一些事情(或者更確切地說,指向它們的指針)。這不是類型,和它不能被用來訪問類型,但它可以被用於例如在相等比較來確定兩個type_info對象是否指的是相同或不同的類型。

0

取決於你所說的「載體」

什麼std::tuple專業化是一個(編譯時)下令類型集合。 你可以對其進行索引(未經測試的代碼):

typedef std::tuple<int, long, void, std::string, std::complex<float> Tuple; 
typename std::tuple_element<1, Tuple>::type foo; // foo is of type long 

你可以做的元組操作的各種(在編譯時),以及這些操作的結果類型(或其他元組)。 C++ 14正式化(但沒有發明)「索引序列」的思想,它可以讓你做任意的元組類型 - >元組類型轉換。