union unMember
{
float fData;
unsigned int uiData;
unMember():uiData(0) {};
unMember(float data):fData(data) {};
unMember(unsigned int data):uiData(data) {};
operator float() {return fData;};
operator unsigned int() {return uiData;};
unMember& operator=(float data) {fData = data;return *this;};
unMember& operator=(unsigned int data) {uiData = data; return *this;};
float GetFloat() const {return fData;};
};
int main () {
float fTest = 1.0;
unsigned int uiTest = 10;
unMember data = fTest;
unMember data2 = uiTest;
unMember data3 = data2;
float f = data.GetFloat();
return 0;
}
Это заставило меня понять, что я почти ничего не знаю о союзах (по крайней мере, в контексте С++, а не C), поскольку я действительно не ожидал, что смогу определить функции-члены для объединения таким образом. Вышеприведенный код подсказывает мне, что в С++ объединение реализуется внутри класса как класс, но на самом деле это случай в стандарте С++ или это просто некоторая причуда компилятора g++?
Кроме того, поскольку это действительно потрясло мое понимание того, что такое профсоюз, я бы приветствовал любые комментарии относительно того, целесообразно ли таким образом реализовать функции-члены для профсоюзов? Есть ли что-то по своей сути небезопасное в вышеупомянутой реализации моего союза?
В прошлом я использовал только союзы в классе контейнера, у которого есть индикаторная переменная, которая хранит, какой тип фактически был написан в союзе, и, честно говоря, я думал, что это их основное использование. Действительно ли это обычное явление для перегрузок конструкторов и т.д. Для профсоюзов таким образом?