Класс, содержащий контейнер с шаблонными объектами - PullRequest
0 голосов
/ 01 июня 2018

У меня есть класс

class A{
vector<B> arr;
};

, где

template <class T>
class B{
T member;
};

Как я хочу иметь возможность сделать что-то вроде

A container;
B<int> b1;
B<char> b2;
...
container.arr.push_back(b1);
container.arr.push_back(b2);

Я пытался добавить шаблон перед классомА, но я не хочу указывать шаблон по классу А, потому что тогда я не смогу выдвигать объекты разных типов.Как мне справиться с этим?

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

Как упоминалось в некоторых комментариях, сохранение переменных различных типов в std::vector может быть не очень хорошей идеей, и на самом деле, если вам нужно сделать это, есть вероятность, что у этих типов есть что-то общее, что вы можете найтиболее подходящие подходы для достижения ваших целей, такие как создание std::vector<std::unique_ptr<Base_Type>>.

. Однако то, что вы пытались сделать, все еще возможно несколько иным способом, используя std::any.

template <typename T>
struct B
{
    T member;
};
// ...
std::vector<std::any> v;
B<int>  bi {123};
B<char> bc {'@'};
B<std::string> bs {"I am a string"};

v.push_back(bi);
v.push_back(bc);
v.push_back(bs);

// Go through vector. You will have to check for the type and
// cast it appropriately before doing anything useful.
for (auto x : v) {
    if (x.type() == typeid(B<int>))
        std::cout << std::any_cast<B<int>>(x).member << std::endl;
    else if (/* ... */)
        // ...
}
// ...
* 1008.* Другим вариантом может быть std::vector из std::variant с, как объяснил Витторио.
0 голосов
/ 01 июня 2018

A template - это конструкция для генерации кода во время компиляции.В примерах кода B - это не тип , а шаблон .

Шаблоны могут быть созданы во время компиляции для генерации типа (например, B<int>).


std::vector<T> - это класс шаблона контейнера, параметризованный в T - он может хранить только объекты типа T.

Если вы хотите хранить объекты различных типов втот же контейнер, вы можете:

  • Использовать std::tuple<Ts...>, если вы знаете последовательность объектов во время компиляции;

  • Использовать что-то вроде std::vector<std::variant<A, B>>, если вы не знаете, является ли объект A или B до времени выполнения.

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