不同类的矢量

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.

Tho*_*mas 2

这是一个尝试尽可能接近您的示例的示例,它可以在 class 上使用模板参数storage_class请参阅此处的工作版本。当您在函数中访问该成员时,我仅添加option1并公开该成员。my_storemain

#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)