Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > частичная специализация для определенного набора -


Автор: boostcoder 7.8.2011, 11:08
есть такой шаблон:
Код

template<bool, bool, bool, enum, enum>
struct type;

что нужно сделать, чтоб постоянно не перечислять некоторые параметры?
т.е. чтоб можно было использовать как-то так:
Код

typedef some_template<true, true, false> parms_pack_one;

...

template<>
struct type<parms_pack_one, enum::item, enum::item2> {
   ...
};


спасибо.

Автор: asmdzen 7.8.2011, 12:24
Код

template<int M, int N, bool X = true, bool Y = true, bool Z = false >
struct type;

type<10, 20> def_params;


хотя я не уверен что оно.

http://drdobbs.com/architecture-and-design/184403850

Автор: boostcoder 7.8.2011, 15:17
asmdzen, такой способ я знаю. но дефолтными нужно сделать параметры слева.

Автор: boostcoder 8.8.2011, 19:48
наверное сабж невозможен...


есть другая идея: вместо bool`ов использовать одну целочисленную переменную и шаблоны-предикаты которые будут проверять состояние бит в переменной.
но тут вопрос: в compile-time можно использовать операции над битами?

Автор: boostcoder 8.8.2011, 20:22
а еще, с операциями над битами я не дружу smile 

Автор: mes 8.8.2011, 20:42
Цитата(boostcoder @  7.8.2011,  14:17 Найти цитируемый пост)
но дефолтными нужно сделать параметры слева. 

а перенести их вправо нее судьба ?

Цитата(boostcoder @  8.8.2011,  18:48 Найти цитируемый пост)
но тут вопрос: в compile-time можно использовать операции над битами? 

если два констехпра, то и рузультат такой же.. 

Цитата(boostcoder @  8.8.2011,  19:22 Найти цитируемый пост)
а еще, с операциями над битами я не дружу   

 smile 

Автор: azesmcar 8.8.2011, 21:02
boostcoder

запросто.

группируем флаги в какую-нибудь группу
Код

template <bool b1, bool b2, bool b3>
struct params_pack
{
   enum
   {
       b1_value = b1,
       b2_value = b2,
       b3_value = b3
   };
};

дальше определяем группы
Код

typedef params_pack<true, true, false> parms_pack_one;
typedef params_pack<true, false, true> parms_pack_two;

реальную структуру type прячем под другим именем, например type_ и меняем три шаблонных переменных заменяем на группу
Код

template <typename ppack, unsigned, unsigned>
struct type_;

далее специализируем type_
Код

template<> struct type_<parms_pack_one, 0, 0> {};
template<> struct type_<parms_pack_two, 0, 0> {};

далее осталось перенаправить тип type<bool b1, bool b2, bool b3, unsigned e1, unsigned e2> на type_<params_pack<b1, b2, b3>, e1, e2>.
Тут небольшая загвоздка, шаблонный typedef пока вроде не поддерживается
Код

template<bool b1, bool b2, bool b3, unsigned e1, unsigned e2>
using type = type_<params_pack<b1, b2, b3>, e1, e2>;

потому придется как-то так
Код

template<bool b1, bool b2, bool b3, unsigned e1, unsigned e2>
struct type
{
    typedef type_<params_pack<b1, b2, b3>, e1, e2> realtype;
};


В итоге получается что-то в этом роде
Код

template <typename ppack, unsigned, unsigned>
struct type_;

template <bool b1, bool b2, bool b3>
struct params_pack
{
   enum
   {
       b1_value = b1,
       b2_value = b2,
       b3_value = b3
   };
};

typedef params_pack<true, true, false> parms_pack_one;
typedef params_pack<true, false, true> parms_pack_two;

template<> struct type_<parms_pack_one, 0, 0> {};
template<> struct type_<parms_pack_two, 0, 0> {};

template<bool b1, bool b2, bool b3, unsigned e1, unsigned e2>
struct type
{
    typedef type_<params_pack<b1, b2, b3>, e1, e2> realtype;
};

/* using */
type<true, true, false, 0, 0>::realtype t;



конечно, если это группа boolean типов, то лучше использовать битовые операции.

Цитата(boostcoder @  8.8.2011,  20:22 Найти цитируемый пост)
а еще, с операциями над битами я не дружу   

http://forum.vingrad.ru/index.php?showtopic=334948&view=findpost&p=2381904

Автор: boostcoder 8.8.2011, 21:15
azesmcar, спасибо огромное. буду пробовать таким способом smile 


зы
Цитата(azesmcar @  8.8.2011,  21:02 Найти цитируемый пост)
http://forum.vingrad.ru/index.php?showtopi...t&p=2381904

у меня есть два момента(это которые я осознаю) которые мне никак в голову не лезут:
1. регекспы.
2. операции над битами.

сколько я не пытался.. smile 

Автор: azesmcar 8.8.2011, 21:17
Цитата(boostcoder @  8.8.2011,  21:15 Найти цитируемый пост)
сколько я не пытался..   

будет время, попробую описать более подробно.

Автор: boostcoder 8.8.2011, 21:53
Цитата(azesmcar @  8.8.2011,  21:02 Найти цитируемый пост)
template <typename ppack, unsigned, unsigned>
struct type_;

а тут обязательно enum заменять на unsigned?

Автор: azesmcar 9.8.2011, 06:46
Цитата(boostcoder @  8.8.2011,  21:53 Найти цитируемый пост)
а тут обязательно enum заменять на unsigned? 

нет, просто мой компилятор этого не поддерживал.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)