Я пытаюсь создать простой вариант в качестве учебного упражнения.
Я хочу сделать это без динамического выделения памяти, как указано в спецификации c ++ для std::variant
.
Для упрощения мой вариант может принимать только два значения.
Вот моя реализация:
//variant style class for two types
template<typename T1, typename T2>
class Either {
using Bigest = std::conditional<sizeof(T1) >= sizeof(T2), T1, T2>;
using ByteArray = std::array<std::byte, sizeof(Bigest)>;
ByteArray val;
std::optional<std::type_index> containedType;
public:
Either() : containedType(std::nullopt) {}
template<typename T>
Either(const T& actualVal) : containedType(typeid(T)) { //ToDo check T is one of correct types
ByteArray* ptr = (ByteArray*)&actualVal;
val = *ptr;
}
class BadVariantAccess {};
template<typename T>
inline T& getAs() const {
if(containedType == typeid(T)) {
T* ptr = (T*)val.data();
return *ptr;
}
else throw BadVariantAccess();
}
};
Однако, когда я проверяю это, я получаю неправильное число после попытки получить значение:
int main() {
Either<int,float> e = 5;
std::cout << e.getAs<int>() << std::endl;
return 0;
}
Возвращает случайное число (например, 272469509).
В чем проблема с моей реализацией и как ее исправить?