2016-03-24 30 views
0

uygulanma biçimi artırmak :: mümkün aşağıdakiVariadically templated struct/varyant

DifferentTypesInOne<string, int, double> variant_obj; 
Eğer variant_obj tür dizeleri, int değişkenleri vardır

ve içinde çift gibi bir etki elde etmek için mi.

Bunun, boost::variant'a benzediğini biliyorum. Daha önce bu konuyla ilgili soruları araştırdım, ancak sınıfın tüm türlerin öğelerini saklamak için variadic şablonlarını nasıl kullandığını açıklayabilecek bir açıklama yapamamıştım. Özellikle, verilen tüm türlerin değişkenlerine sahip olan bir struct tanımını ve şu anda hangisinin önemli olduğunu belirten bir üye değişkeni tanımlamak için nasıl gidebileceğimi soruyorum.

Teşekkürler! Kabaca

+0

Bir varyant için, ya sendikayla özyineleme, ya da bir depolama parçanız var ve yerleşimi yeni kullanın. –

+0

Bir yapının içinde varadik bir şablon listesinde yer alan birçok öğeye nasıl sahip olabileceğimi anlamakta zorlanıyorum – Curious

+0

Bu yorum anlamlı mı? – Curious

cevap

2

,

template<class... Ts> 
struct variant_storage {}; 

template<class T, class... Ts> 
struct variant_storage<T, Ts...>{ 
    union { 
     T head; 
     variant_storage<Ts...> tail; 
    }; 
}; 

template<class... Ts> 
struct variant { 
    int index; 
    variant_storage<Ts...> storage; 
}; 

Bu

bir taslaktır; Ayrıntılar için these articles iyi bir okumadır.

constexpr -ness'e ihtiyacınız yoksa, bir std::aligned_union_t<0, Ts...> depo olarak saklayabilir ve daha yeni olan yerleşimi kullanabilirsiniz.

+0

Bu harika bir şey. Tam olarak neler olduğunu açıklar mısınız? – Curious

+0

@Curious: Bu özyineleme, temel bir şablon meta programlama aracı (ve genel olarak programlama). –

+0

Özyineleme olmadığını bekleyin. Gerçek özyineleme olmayan derleme zamanı tekrarı mı? – Curious

1

C++ 11, türlerin bir listesini alan bir şablon türü olan std::aligned_union sağladı. aligned_union::type, verilen tiplerden herhangi birinin depolanması için yeterli depolama alanına ve hizalamaya sahip olan bir tiptir.

Böylece veriler için depolama alanı oluşturuyorsunuz. Bunun ötesinde ihtiyacınız olan tek şey, burada hangi değerin depolandığını söyleyen bir tamsayıdır.

template<typename ...Types> 
struct variant 
{ 
private: 
    uint8_t index; 
    typename std::aligned_union<Types...>::type storage; 
}; 

Sen storage tarafından sağlanan depolama içinde, belirli bir türde tek tek öğeleri ayırmak için yerleştirme new kullanın.

+0

bir endeksle mi? – Curious

+0

Türü bir diziyle nasıl eşleştirirsin? – Curious

İlgili konular