Purpose of Unions in C and C++

后端 未结 16 1924
予麋鹿
予麋鹿 2020-11-22 06:55

I have used unions earlier comfortably; today I was alarmed when I read this post and came to know that this code

union ARGB
{
    uint32_t colour;

    str         


        
16条回答
  •  旧巷少年郎
    2020-11-22 07:29

    As others mentioned, unions combined with enumerations and wrapped into structs can be used to implement tagged unions. One practical use is to implement Rust's Result, which is originally implemented using a pure enum (Rust can hold additional data in enumeration variants). Here is a C++ example:

    template  struct Result {
        public:
        enum class Success : uint8_t { Ok, Err };
        Result(T val) {
            m_success = Success::Ok;
            m_value.ok = val;
        }
        Result(E val) {
            m_success = Success::Err;
            m_value.err = val;
        }
        inline bool operator==(const Result& other) {
            return other.m_success == this->m_success;
        }
        inline bool operator!=(const Result& other) {
            return other.m_success != this->m_success;
        }
        inline T expect(const char* errorMsg) {
            if (m_success == Success::Err) throw errorMsg;
            else return m_value.ok;
        }
        inline bool is_ok() {
            return m_success == Success::Ok;
        }
        inline bool is_err() {
            return m_success == Success::Err;
        }
        inline const T* ok() {
            if (is_ok()) return m_value.ok;
            else return nullptr;
        }
        inline const T* err() {
            if (is_err()) return m_value.err;
            else return nullptr;
        }
    
        // Other methods from https://doc.rust-lang.org/std/result/enum.Result.html
    
        private:
        Success m_success;
        union _val_t { T ok; E err; } m_value;
    }
    

提交回复
热议问题