Анонимный союз / структура, содержащая общий вектор

Я пытаюсь создать анонимный союз, который содержит общий вектор, чтобы использовать его в качестве члена класса, не называя type_name самого объединения.

Чтобы я мог вызвать вектор внутри класса следующим образом:

vec.size();

Но мой подход

template <typename T>
union{
std::vector<T> vec;
};

только даст мне ошибкушаблон класса без имениMsgstr «Это также происходит со структурами. Так не нравится ли быть анонимным, когда оно является общим?

Результаты поиска просто дали мне возможность создать общий вектор внутри именованной структуры, но, кроме того, я также не мог заставить это работать, я бы потерял преимущества анонимного объединения, и мне нужно было бы назвать вектор, например. как

struct_name.vec.size();

или даже

class_name.struct_name.vec.size();

которого я пытался избежать.

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

0

Решение

Вы не можете надежно делать то, что вы хотите. Вам нужен хотя бы какой-то способ различения во время выполнения, если у вас есть вектор типа int или вектор типа float.

С C ++ 11 вы можете кодировать

class StrangeVector {
bool has_int;
union {
std::vector<int> vint;
std::vector<float> vfloat;
};
public:
StrangeVector(bool withints) : has_int(withints) {
if (withints) new(&vint) std::vector<int>();
else new(&vfloat) std::vector<float>();
};
~StrangeVector {
if (has_int) vint.~std::vector<int>();
else vfloat.~std::vector<float>();
}
}

Но такой код действительно плохо пахнет. (Я бы предложил использовать объединение указателей, возможно, умных указателей, например, станд :: shared_ptr или же станд :: unique_ptr, или возможно std::optional; увидеть этот).

Смотрите также этот, или же повышение :: любой

Обратите внимание, что кроме RTTI информация о наборе используется в время компиляции в C ++.

0

Другие решения

Других решений пока нет …