Вектор шаблонных векторов - PullRequest
6 голосов
/ 07 июня 2019

Я хочу создать вектор векторов, где отдельные векторы могут быть разных типов, следующим образом:

std::vector<int> v1;
std::vector<float> v2;
std::vector<double> v3;

std::vector<SomeType> all;
all.push_back(v1);
all.push_back(v2);
all.push_back(v3);

Что должно быть SomeType в этом случае?

Мой фактический вариант использования:

У меня есть векторы разных типов данных, которые нужно записать на диск. Каждый раз, когда я добавляю столбец в набор данных, я не хочу указывать столбец в разных местах. Я хочу, чтобы можно было легко перебирать столбцы.

Ответы [ 2 ]

5 голосов
/ 07 июня 2019

Есть много способов сделать это, в зависимости от вашей ситуации.Вот вариант (каламбур) с std :: variable:

std::vector<int> v1 = { 1, 2, 3 };
std::vector<float> v2 = { 4.5f, 5.5f, 6.5f };
std::vector<double> v3 = { 7.5, 8.5, 9.5 };

std::vector<std::variant<std::vector<int>, std::vector<float>, std::vector<double>>> all;
all.push_back(v1);
all.push_back(v2);
all.push_back(v3);

for(auto& variant : all)
{
    std::visit([](const auto& container) {
        for(auto value : container)
        {
            std::cout << value << '\n';
        }
    }, variant);
}

std::any с удалением типа также будет работать.Или перейти на один уровень ниже, например, с std::vector<std::variant<int, float, double>>.

0 голосов
/ 07 июня 2019

Вы не можете сделать это, потому что все 3 векторных типа различны.

Однако вы можете создать абстрактный шаблон без шаблонов с необходимыми абстрактными функциями, которые вам нужны для std :: vector, а затем реализовать его для каждого типа вектора.

Примерно так:

struct Base
{
      int size() = 0;
};

template <typename T>
struct VectorWrapper : public Base
{
      std::vector<T>* mVector;
      int size() { return mVector.size(); }
};

int main()
{
     std::vector<int> v;
     // initialize vector

     VectorWrapper<int> w;
     w.mVector = &v;

     std::vector<Base*> all;
     all.push_back(&w)

     return 0; 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...