madf: (Default)
madf ([personal profile] madf) wrote2012-07-31 09:32 pm

Генератор лінійних ієрархій

Хто читав Алєксандреску той знає, а хто не читав - картинко під катом:

hbuilder
Код:
template <template <typename> class TypeWrapper, typename ... Ts>
struct HBuilder;

template <template <typename> class TypeWrapper, typename T>
struct HBuilder<TypeWrapper, T> : TypeWrapper<T> {
typedef TypeWrapper<T> WrappedType;

template <typename F>
void fmap(F & f) { f(*static_cast<WrappedType *>(this)); }
};

template <template <typename> class TypeWrapper, typename T, typename ... Ts>
struct HBuilder<TypeWrapper, T, Ts ...> : TypeWrapper<T>, HBuilder<TypeWrapper, Ts ...> {
typedef HBuilder<TypeWrapper, Ts ...> Next;
typedef TypeWrapper<T> WrappedType;

template <typename F>
void fmap(F & f) { f(*static_cast<WrappedType *>(this)); Next::fmap(f); }
};
_Winnie C++ Colorizer

fmap бо там із усіх щілин стирчать вуха функтора.
Можна розглядати це як контейнер контейнерів типів.
Код було написано задовго то сортування типів, бо сортування мені знадобилось у самому кінці.

Уже як запостив - побачив. Там F & треба передавати константно. Ну то дрібниці.

У наступному пості напишу про те, нафіга все це потрібно. Яке воно має практичне застосування. Окрім fun, звісно :)