У меня есть два класса A и B, определенные в большой базе кода. Я хотел бы создать псевдоним типа, который означает «A или B». Обратите внимание, что этот класс никогда не переключится с A на B во время выполнения (и наоборот). Как я могу это сделать?
Я подумал о том, чтобы просто создать пустой класс AorB и сделать A и B производными от него. Однако я бы предпочел не изменять A или B.
Я думал об использовании объединения, но это кажется расточительным с точки зрения памяти, так как это оставляет место для самого большого класса.
Чтобы попытаться быть яснее, вот код, иллюстрирующий мой вопрос:
class A;
class B;
//typedef AorB = A || B //<- how can I do sthg like that ?
class C {
AorB myAorB; // once this object is set, it cannot change its underlying type (it stays an A or a B)
};
Другими возможными решениями (вашей неизвестной проблемы) может быть полиморфизм, когда у вас есть абстрактный базовый класс, определяющий интерфейс, а затем реализация либо в A
, либо в B
. Затем у вас есть указатель на базовый класс, и он указывает на экземпляр объекта A
или B
.
Как насчет комбинации двух typedef
s и #ifdef
макроса?
Как вы выбираете между ними? Почему бы не написать просто using opaque_type = A;
, а затем просто изменить его на `= B;`, если это необходимо.
Note that this class will never switch from being an A to being a B during runtime (and vice-versa)
Вы хотите использовать std::conditional
, например.
#include <type_traits>
constexpr bool useAOrB() { /* Some actual logic here... */ return true; }
class C {
std::conditional_t<useAOrB(), A, B> myAorB;
};
union
изA
иB
? Илиstd::variant<A, B>
?