Создание шаблонов из списка типов произвольной длины в C ++
-
22-09-2019 - |
Вопрос
Вот что я хочу, чтобы иметь возможность печатать:
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 это делает, но, похоже, это связано с тем, что между мной и шаблонами есть слой макросов.
Как я мог бы поступить по этому поводу?Я бы предпочел не создать гигантский список шаблонов для каждого количества типов, но если это единственный способ, то это единственный способ...
Редактировать:Я стал совершенно уверен, что нет никакого способа сделать то, что я хочу сделать (почти, но у вас не может быть переменного числа аргументов макроса), но вопрос по-прежнему генерирует полезные и информативные ответы.
Решение
В гигантский список шаблонов для каждого количества типов это единственный способ сделать это в текущей версии C ++.Смотрите boost::tuple для примера того, как это сделать.
C ++0X поддерживает вариативные шаблоны, но это пока поддерживается недостаточно хорошо (хотя я думаю, что современная версия GCC имеет экспериментальную поддержку).
Другие советы
В качестве альтернативы вы можете сделать это рекурсивно
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> { };