Упрощение шаблонов - PullRequest
       9

Упрощение шаблонов

1 голос
/ 16 августа 2011

В одном из моих проектов у меня есть следующая иерархия шаблонов классов:

template <typename FruitType, typename ParentFilterType = void>
class filter;

template <typename FruitType> // Specialization when no parent filter is needed
class filter<FruitType, void>;

Где FruitType может быть чем угодно.Допустим, это один из apple, banana или orange.В общем, filter может иметь свой собственный родительский тип filter.

У меня нет контроля над кодом filter: он должен оставаться как есть .

Код пользователя обычно выглядит следующим образом:

filter<apple, filter<banana, filter<orange> > > my_apple_filter;

Очевидно, это немного многословно.Я задавался вопросом, возможно ли получить что-то более читабельное.Что-то вроде:

complex_filter<apple, banana, orange>::type my_apple_filter;

Где complex_filter<apple, banana, orange>::type будет преобразовано в filter<apple, filter<banana, filter<orange> > >.

Я пытался с complex_filter быть шаблоном struct с typedef внутри, но не имелпока успех.Количество параметров шаблона должно быть переменным (скажем, от 1 до 5).

Вам когда-нибудь нужно что-то подобное?Как я могу это сделать?

(я, к сожалению, не могу использовать C ++ 0x, но если есть более хорошее решение с ним, не стесняйтесь публиковать его, как это всегда полезно знать)

Спасибо.

Ответы [ 2 ]

4 голосов
/ 16 августа 2011

В C ++ 0x это будет шаблон с переменным числом символов.

Без C ++ 0x вы можете просто использовать большой список параметров с предоставленными значениями по умолчанию.

template <typename F0, typename F1 = void, typename F2 = void, typename F3 = void>
struct complex_filter
{
  typedef filter<F0, typename complex_filter<F1, F2, F3>::type> type;
};

template <>
struct complex_filter<void,void,void,void>
{
  typedef void type;
};

Затем его можно использовать по своему усмотрению, и вам придется расширять его вручную, если вам когда-нибудь понадобится больше параметров.

0 голосов
/ 16 августа 2011

то, что вы пробовали, должно работать, вроде:

template< class A, class B >
struct complex_filter2
{
  typedef typename filter< A, filter< B > > type;
};

template< class A, class B, class C >
struct complex_filter3
{
  typedef typename filter< A, filter< B, filter< C > > > type;
};

//etc
...