ОК, это заставило меня задуматься.
Мой код основан на идее, что базовые не виртуальные классы размещаются в памяти в порядке их объявления. Я не думаю, что это гарантировано, но IMO, по крайней мере, довольно распространено. Это также позволяет вам использовать ваш тип цвета для различного количества цветов.
template <typename TYPE> struct R { TYPE Red; };
template <typename TYPE> struct G { TYPE Green; };
template <typename TYPE> struct B { TYPE Blue; };
template <typename Bases>
struct Color : inherit_from<Bases>
{
// ...
};
typedef Color< generate_color_list<R,G,B>::result_t > ColorRGB_t;
typedef Color< generate_color_list<B,G,R>::result_t > ColorBGR_t;
Теперь все, что вам нужно, это generate_color_list
и это inherit_from
.
Учитывая это определение списка простых типов
struct nil {};
template< typename Head, typename Tail >
struct type_list {
typedef Head head_type;
typedef Tail tail_type;
};
Вот не очень обобщенная попытка генератора списка типов цвета:
template< typename T1, typename T2, typename T3 >
struct generate_color_list {
typedef type_list< T1,
type_list< T2,
type_list< T3, nil > > > result_t;
};
А это выстрел в inherit_from
:
template< typename List >
struct inherit_from;
template<>
struct inherit_from<nil> {}
template< typename Head, class Tail >
struct inherit_from< type_list<Head,Tail> >
: public Head
, public inherit_from<Tail>
{};
Я не пытался скомпилировать ничего из этого, поэтому у него будут смущающие ошибки. Я уже краснею.