gpt4 book ai didi

c++ - 不同类别的 vector

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:18:20 25 4
gpt4 key购买 nike

我有一个带有 vector 的类,我想用用户选择的两种类型之一填充。让我们称我的类(class)为 option1 和 option2

我想做的事情是这样的

class storage_class 
{
public:
storage_class(int sel, int n)
{
if(sel == 1)
for(int i = 0; i < n; i++)
my_store.push_back(std::make_unique<option1>());
else if(sel == 2)
for(int i = 0; i < n; i++)
my_store.push_back(std::make_unique<option2>());
}

private:
// Something like this but that actually works
std::vector<T> my_store;
};

然后我想像这样使用它,或者类似的东西,所以不需要根据选择的选项修改这个用法。

int main()
{
storage_class store(1);

int n_iterations = 4;

for(int i = 0; i < n_iterations; i++)
{
store.my_store[i]->create_data();
}
}

类 option1 和 option2 将是数学模拟,它们将创建数据并将这些数据本身存储在作为类成员的 vector 中。

我想将任一选项的多个实例存储在一个 vector 中,然后从那里操作它们。我可以使用 C++17。

最佳答案

当您使用 c++17 时,您可以简单地使用 std::variant 作为容器的类型,容器本身可以保留您想要的所有类型。

例子:

class A { public: void Do() { std::cout << "A::Do" << std::endl; } };
class B { public: void Go() { std::cout << "B::Go" << std::endl; } };


template<class... Ts> struct funcs : Ts... { using Ts::operator()...; };
template<class... Ts> funcs(Ts...) -> funcs<Ts...>;

int main()
{
std::vector<std::variant<A,B>> vec;
vec.push_back(A{});
vec.push_back(B{});

for ( auto& el: vec)
{
std::visit( funcs{ [](A& a){ a.Do(); }, [](B& b) { b.Go(); } }, el);
}
}

输出:

A::Do
B::Go

这些类是完全独立的,可以使用 std::visit 简单地调用这些方法,并在此处传递一个可调用对象。我提供了一个简单的 funcs 实现,它只是收集所有可调用实体,以简化对此处不同不相关类的不同方法的调用的接口(interface)。

由于 std::variant 是某种标记 union ,它需要存储您使用的最大类型。如果这会浪费大量内存,您可以存储一个指向实例的指针,如果您需要内存管理方面的帮助,可以使用 std::unique_ptrstd::shared_ptr ;)

关于c++ - 不同类别的 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52300657/

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