Навеяно веткой про boost в "Прикладных вопросах" и попыткой
творчески осмыслить конструкцию из примера boost
(
http://www.boost.org/libs/mpl/doc/#metafunctions )
template< typename T >
struct can_be_on_stack
: mpl::bool_c< (sizeof(T) <= sizeof(double)) >
{
};
// use 'if_' to choose where to store 'T' member
template< typename T >
struct lightweight
: private mpl::if_<
can_be_on_stack<T>
, stack_holder<T>
, heap_holder<T>
>::type
{
// ...
};
На мой взгляд такие "syntax mixin" еще хуже чем старые добрые #define
В качестве альернативы я бы предложил ввести в язык нечто типа
типизированных meta функций, например приведенный пример можно записать так:
meta
bool can_be_on_stack(typename T) {
return (sizeof(T) <= sizeof(double));
}
meta
typename optimal_holder(typename T)
{ return can_be_on_stack(T)? tack_holder<T>:heap_holder<T>; }
template< typename T >
struct lightweight : private optimal_holder<T>
{
};
Я не уверен в синтасической полноте / гармоничности такого рода конструкций
поэтому давайте помечтаем вместе: "как оно должно быть на самом деле?"
Как дополнить синтаксис template<> что бы получить meta if, meta switch и т.д.
Ваши предложения?
27.10.04 23:51: Перенесено модератором из 'C/C++. Прикладные вопросы' — Павел Кузнецов