gpt4 book ai didi

c++ - 实现类 std::variant 类时存储类型标记的问题

转载 作者:IT老高 更新时间:2023-10-28 22:39:24 28 4
gpt4 key购买 nike

我的目标是写std::variant , 可能还没有完全成熟,但至少有完整的构造函数/析构函数对和 std::get<>()功能。

我尝试使用 char 数组保留内存。它的大小由最大的类型决定,使用 find_biggest_size<>() 找到。功能。构造函数使用静态断言,因为它执行检查类型是否在指定类型列表中。目前,构造函数和就地构造函数都可以工作。

template <typename ... alternatives>
class variant
{
char object[find_biggest_size<alternatives...>::value];
public:
template <typename T>
variant(T&& other)
{
static_assert(is_present<T, alternatives...>::value, "type is not in range");
new ((T*)&object[0]) T(std::forward<T>(other));
}

template <typename T, typename ... ArgTypes>
variant(in_place_t<T>, ArgTypes&& ... args)
{
static_assert(is_present<T, alternatives...>::value, "type is not in range");
new ((T*)&object[0]) T(std::forward<ArgTypes>(args)...);
}

~variant()
{
// what to do here?
}
};

然后我偶然发现了一个问题。我不知道当对象死亡时要执行什么析构函数。最重要的是,无法访问底层对象,因为我无法专门化 std::get<>()获得正确的类型。

我的问题是:对象创建后如何存储类型?这是正确的方法吗?如果没有,我应该使用什么?

编辑:

我尝试应用评论。问题是当前事件的类型的索引不能是constexpr ,因此我无法从类型列表中提取所需的类型并调用适当的析构函数。

~variant()
{
using T = typename extract<index, alternatives...>::type;
(T*)&object[0]->~T();
}

编辑:

我已经做了一个基线实现。它可以工作,但有很多缺失的功能。你可以找到它here .我很高兴收到评论,但请先阅读 how do I write a good answer? .

最佳答案

我可能会如何开始:

#include <iostream>
#include <utility>
#include <array>

template<class...Types>
struct variant
{
variant() {}
~variant()
{
if (type_ >= 0)
{
invoke_destructor(type_, reinterpret_cast<char*>(std::addressof(storage_)));
}
}

template<class T> static void invoke_destructor_impl(char* object)
{
auto pt = reinterpret_cast<T*>(object);
pt->~T();
}

static void invoke_destructor(int type, char* address)
{
static const std::array<void (*)(char*), sizeof...(Types)> destructors
{
std::addressof(invoke_destructor_impl<Types>)...
};
destructors[type](address);
}

std::aligned_union_t<0, Types...> storage_;
int type_ = -1;

};

int main()
{
variant<int, std::string> v;

}

关于c++ - 实现类 std::variant 类时存储类型标记的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39296127/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com