Как поместить значения переменной аргумента шаблона, но одного типа в переменную этого типа? C ++ - PullRequest
0 голосов
/ 01 октября 2019

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

Например. У меня есть класс A с шаблоном:

template <typename T>
class A
{
}

И у меня есть набор значений типа A, но другой аргумент шаблона:

A<int> aIntVar;
A<char> aCharVar;
A<bool> aBoolVar;

Так что я хочу бытьв состоянии поставить указатели на каждый из них в

std::vector< /*pointer to some type that can store values above*/ > vectorOfAValues;

Вот так:

vectorOfAValues.emplace_back(&aIntVar);
vectorOfAValues.emplace_back(&aCharVar);
vectorOfAValues.emplace_back(&aBoolVar);

Но я не могу, потому что типы этих значений не полиморфны своему типу без аргументов шаблона.

Грубо говоря, я хочу сделать полиморфизм среди семейства типов, состоящих из одного типа, но с другим аргументом шаблона.

Ответы [ 2 ]

2 голосов
/ 01 октября 2019

Вы можете использовать

struct BaseA { ... };

template <typeaname T> class A : public BaseA { ... };

Но тогда вам придется хранить указатели на BaseA, предпочтительно умные указатели.

std::vector<std::shared_ptr<BaseA>> vectorOfAValues;

или

std::vector<std::unique_ptr<BaseA>> vectorOfAValues;
0 голосов
/ 01 октября 2019

На C ++ 17 вы можете использовать

std :: any

#include <any>
#include <vector>

template<class X>
class A {}

int main(int, char**) {
   std::vector<std::any> myVec {A<char>{}, A<int>{}, A<float>{}};
   return 0;
}

или с указателями

...
std::any anyA = A<int>{};
std::any anyB = A<float>{};

std::vector<std::any*> a{&anyA, &anyB};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...