簡體   English   中英

矢量typedef

[英]Vector of typedefs

是否有可能以任何方式有類型的載體(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 */ );

也許你可以查看Loki的類型列表(見這里 )。 這里使用它們有一個問題。 我認為這與你正在尋找的東西一樣接近。 Boost MPL也有類似的東西(見這個問題 ), 類型列表類型向量

Boost MPL為此提供了編譯時構造,例如:

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

您可以使用mpl中定義的大量元函數在編譯類型中與此進行交互。 還有一些運行時交叉功能。 這里重要的一點是,這是一個類型序列,沒有每種類型的實例可以與之交互。 甚至運行時函數也只允許與類型進行交互。

Boost Fusion(和std::tuple )在這里提供了一個運行時異構容器,例如

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

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

有可能你想要實現的東西可以通過普通繼承來完成,而不必訴諸於上面,所以向量包含一個指向基類的指針,它有一個虛函數,在派生類中被覆蓋,它做了什么你要。 這可能是最干凈的。

或者,如果您使用可變參數類型(例如boost::variant ,則可以使用相同的方法,而不需要使用繼承,例如:

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

現在每個條目都是intdoublestd::string類型之一。 然后在迭代時,您可以使用靜態訪問者對特定實例進行操作。 我想我剛剛回答了一個問題,證明了這一點。

那會是哪個?

編輯:基於你的最后一個評論,然后后者(變體)並沒有真正飛行,也沒有普通的繼承。 我認為融合矢量確實不是必需的,因為你不需要每種類型的實例。 對你來說最合適的是mpl::vector ,並使用運行時函數mpl::for_each

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

根據您的實際需要,您可以使用type_info (或者更確切地說,指向它們)來執行某些操作。 這不是類型,它不能用於訪問類型,但它可以用於例如相等比較中,以確定兩個type_info對象是否引用相同或不同的類型。

取決於你的意思“矢量”

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形式化(但沒有發明)“索引序列”的概念,它允許你做幾乎任意的元組類型 - >元組類型轉換。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM