繁体   English   中英

可变模板化的结构/如何实现boost :: variant

[英]Variadically templated struct / How boost::variant is implemented

是否有可能达到如下效果

DifferentTypesInOne<string, int, double> variant_obj;

您的variant_obj具有字符串,整数和双variant_obj类型的变量。

我知道这类似于boost::variant 我之前曾搜索过有关此问题的信息,但未能找到一个可以解释该类如何使用可变参数模板存储所有类型的元素的解释。 特别是我在问我如何定义一个struct ,该struct具有所有给定类型的变量和一个成员变量,该变量表示当前哪个是重要的。

谢谢!

大致,

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;
};

这是草图; 有关详细信息, 这些 文章是不错的阅读。

如果不需要constexpr -ness,则可以存储std::aligned_union_t<0, Ts...>作为存储,并使用new放置,这更简单。

C ++ 11提供了一个模板类型std::aligned_union ,它接受类型列表。 aligned_union::type是一种类型,具有足够的存储空间和对齐方式,可以作为任何给定类型的存储。

这样便可以创建数据存储。 除此之外,您所需要的只是一个整数,该整数指示存储在其中的值。

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

在storage提供的storage ,可以使用new放置将各个元素分配给特定类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM