Шаблонирование списка типов произвольной длины в C ++ - PullRequest
2 голосов
/ 24 февраля 2010

Вот что я хочу набрать:

class foo : public watchKeys<A, B, C> {}; //Or any list of keys

Boost :: mpl имеет последовательности, которые позволяют вам делать это, но я не хочу делать:

class foo : public watchKeys<mpl::list<A, B, C> > {};

Я не возражаю против того, чтобы быть "уродливым" или многословным внутри, но я хочу, чтобы в конечном итоге watchKeys был очень простым и интуитивно понятным. Я также не могу понять, как boost делает это, но, похоже, это потому, что между мной и шаблонами есть слой макросов.

Как я могу пойти по этому поводу? Я бы предпочел , а не , чтобы сделать огромный список шаблонов для каждого количества типов, но если это единственный, то единственный способ ...

Редактировать: Я стал совершенно уверен, что нет никакого способа сделать то, что я хочу сделать (почти, но у вас не может быть переменного числа макро аргументов), но вопрос все еще генерирует полезные и информативные ответы.

Ответы [ 2 ]

1 голос
/ 24 февраля 2010

Огромный список шаблонов для каждого количества типов - единственный способ сделать это в текущей версии C ++. Смотрите boost :: tuple для примера того, как это сделать.

C ++ 0X поддерживает variadic шаблонов , но это пока не поддерживается (я думаю, что современная версия GCC имеет экспериментальную поддержку).

0 голосов
/ 08 марта 2010

Или вы можете сделать это рекурсивно

template<typename Head, typename Tail>
struct list { };

struct emptylist { };

class foo : public watchKeys<list<A, 
                             list<B, 
                             list<C, emptylist> > > > { };

Затем вы можете обработать его следующим образом

template<typename List>
struct process;

template<typename Head, typename Tail>
struct process< list<Head, Tail> > : process<Tail> { 
  // process Head
};

template<>
struct process<emptylist> { };
...