[英]Is it guaranteed that size_t, vector::size_type, etc typedefs won't bind to a char type?
[英]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 */ );
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;
現在每個條目都是int
, double
, std::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.