#include <iostream>
#include <cstdlib>
#include <cassert>
using namespace std;

struct rgba
{
    uint8_t r, g, b, a;

    constexpr uint8_t& operator[](size_t x)
    {
        return const_cast<uint8_t*>(&r)[x];
    }
};

struct rgba2
{
    uint8_t r, g, b, a;

    constexpr uint8_t& operator[](size_t x)
    {
    	assert(x>=0 && x<4);
    	switch (x){
    		case 0: return r; 
    		case 1: return g;  
    		case 2: return b;  
    		case 3: return a; 
    		//default: throw(1);  // not possible with constexpr
    	}
    }
};

struct rgba3
{
	enum ergb { red, green, blue, alpha};
    uint8_t c[alpha+1];

    constexpr uint8_t& operator[](ergb x)
    {
     	assert(x>=0 && x<4);
     	return c[x];
    }
};


int main() {
	// your code goes here
	rgba2 cola;
	rgba3 colb; 
	cola[1]=2;
	colb[rgba3::green]=3;
	
	return 0;
}