Gar*_*Gar 5 c++ templates c++17
我有一个带有向量的类,我想用两种类型中的一种填充,由用户选择.让我们调用我的类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;
};
Run Code Online (Sandbox Code Playgroud)
然后我想像这样或者类似的东西使用它,所以不需要根据所选的选项修改这种用法.
int main()
{
storage_class store(1);
int n_iterations = 4;
for(int i = 0; i < n_iterations; i++)
{
store.my_store[i]->create_data();
}
}
Run Code Online (Sandbox Code Playgroud)
类option1和option2将是数学模拟,它将创建数据并将自己的数据存储在作为类成员的向量中.
我想在向量中存储任一选项的多个实例,然后从那里操作它们.我可以使用C++ 17.
这是一个尝试尽可能接近您的示例的示例,它可以在 class 上使用模板参数storage_class
。请参阅此处的工作版本。当您在函数中访问该成员时,我仅添加option1
并公开该成员。my_store
main
#include <memory>
#include <vector>
#include <iostream>
struct option1{
void create_data(){ std::cout << "created\n"; }
};
template<typename T>
class storage_class
{
public:
storage_class(int n)
{
for(int i = 0; i < n; i++)
my_store.push_back(std::make_unique<T>());
}
std::vector<std::unique_ptr<T>> my_store;
};
int main()
{
storage_class<option1> store(4);
int n_iterations = 4;
for(int i = 0; i < n_iterations; i++)
{
store.my_store[i]->create_data();
}
}
Run Code Online (Sandbox Code Playgroud)
另一种选择是使用std::variant
. 请参阅此处的workign 版本。
#include <memory>
#include <vector>
#include <variant>
#include <iostream>
struct option1{
void create_data(){ std::cout << "created 1\n"; }
};
struct option2{
void create_data(){ std::cout << "created 2\n"; }
};
class storage_class
{
public:
using option = std::variant<std::unique_ptr<option1>,std::unique_ptr<option2>>;
storage_class(int sel, int n)
{
if(sel == 0)
for(int i = 0; i < n; i++)
my_store.push_back(option(std::make_unique<option1>()));
else if(sel == 1)
for(int i = 0; i < n; i++)
my_store.push_back(option(std::make_unique<option2>()));
}
std::vector<option> my_store;
};
int main()
{
storage_class store(1, 4);
int n_iterations = 4;
for(int i = 0; i < n_iterations; i++)
{
std::get<1>(store.my_store[i])->create_data();
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
315 次 |
最近记录: |