gpt4 book ai didi

c++ - 默认在std::variant中构造所有类型,并将它们放入std::vector中

转载 作者:行者123 更新时间:2023-12-01 15:04:42 25 4
gpt4 key购买 nike

我将如何制作一个std::vector,其中包含std::variant中包含的所有类型的默认构造的实例?

using TaskVariant = std::variant<TypeA, TypeB, TypeC>;
std::vector<TaskVariant> variants;

// I'd like to do this in a loop
variants.push_back(TypeA());
variants.push_back(TypeB());
variants.push_back(TypeC());

最佳答案

1.解决方案:您可以将变体转换为元组,然后使用C++ 17 std::apply :

#include <variant>
#include <iostream>
#include <string>
#include <vector>
#include <tuple>

using namespace std;

template <typename... Types>
struct ToTuple;

template <typename... Types>
struct ToTuple<variant<Types...>>
{
using type = tuple<Types...>;
};

struct TypeA {};
struct TypeB {};
struct TypeC {};

using TaskVariant = std::variant<TypeA, TypeB, TypeC>;

int main()
{
vector<TaskVariant> vec;
apply([&vec](auto&&... args) {(vec.push_back(args), ...); }, ToTuple<TaskVariant>::type{});
}
编辑:
2.解决方案:使用 make_index_sequence variant_alternative_t variant_size_v (所有C++ 17)(感谢 @s通过将sant 指向__on_strong,将 _ont而不是递归):
#include <variant>
#include <iostream>
#include <string>
#include <vector>
using namespace std;

struct TypeA {};
struct TypeB {};
struct TypeC {};

using TaskVariant = std::variant<TypeA, TypeB, TypeC>;

template <size_t... Idx>
void fill_vec(vector<TaskVariant>& vec, index_sequence<Idx...> idx)
{
(vec.push_back(variant_alternative_t<Idx, TaskVariant>{}), ...);
}

int main()
{
vector<TaskVariant> vec;
fill_vec(vec, make_index_sequence<variant_size_v<TaskVariant>>{});
}

关于c++ - 默认在std::variant中构造所有类型,并将它们放入std::vector中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63823544/

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