Создание шаблонов из списка типов произвольной длины в C ++

StackOverflow https://stackoverflow.com/questions/2323770

Вопрос

Вот что я хочу, чтобы иметь возможность печатать:

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> { };
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top