Ограничено ли количество типов в шаблонном варианте C ++? - PullRequest
2 голосов
/ 25 января 2010

Я пытаюсь понять, как реализуются варианты, и читаю:

http://www.codeproject.com/KB/cpp/TTLTyplist.aspx

И у меня создается впечатление, что я не могу написать вариант, который принимает X типов; но что шаблонизатор выбирает несколько N, и у меня может быть только меньше чем N типов в варианте.

Это правильно?

Спасибо!

Ответы [ 4 ]

4 голосов
/ 25 января 2010

В C ++ 03 нет шаблонов с вариацией. Это значит да; вам просто нужно выбрать N, чтобы подняться и жить с этим.

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

Если вы хотите легко изменить номер, вы можете использовать Boost.Preprocessor , и он сделает всю работу за вас:

#define MAXIMUM_TYPELIST_SIZE 20 // or something

struct empty{};

template <BOOST_PP_ENUM_BINARY_PARAMS(MAXIMUM_TYPELIST_SIZE, typename T, =empty)>
struct typelist;

template <BOOST_PP_ENUM_PARAMS(MAXIMUM_TYPELIST_SIZE, typename T)>
struct typelist
{
    typedef T1 head;
    typedef typelist<
            BOOST_PP_ENUM_PARAMS(BOOST_PP_DEC(MAXIMUM_TYPELIST_SIZE), T)> tail;
    enum
    {
        length = tail::length+1
    };
};

Если бы MAXIMUM_TYPELIST_SIZE было 5, эти макросы расширились бы до того, что есть в статье.

(Конечно, если вы используете Boost, просто используйте библиотеку метапрограммирования .)

2 голосов
/ 25 января 2010

Без поддержки шаблонов с переменными параметрами авторы шаблонов могут предоставлять только обходные пути, которые выглядят как шаблоны с переменными параметрами:

template<class Arg1=nil, class Arg2=nil /* , ... */>
struct foo {};

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

Если они не предоставят такие обходные пути, вы будете вынуждены прибегнуть к явным спискам типов, которые довольно неуклюжи по сравнению:

typedef list<T1, list<T2, list<T3, nil> > > myTypeList;
foo<myTypeList>::bar;

Они не ограничены фиксированным количеством типов, но я не хотел бы использовать их явно.

Со следующим стандартом C ++ это будет решено с помощью настоящих вариационных шаблонов:

template<class... Args> // can take 0..n arguments 
struct foo {};
2 голосов
/ 25 января 2010

Да - есть ограничение, установленное реализацией библиотеки. IIRC, в Локи максимум 99 по умолчанию. Взглянув на эту статью, он установил предел в 5, что, вероятно, достаточно для большой работы, но я вижу возможность его превысить; Я не могу себе представить, что превышение 99 разрешений Loki (хотя в любом случае это тривиальная задача редактирования, чтобы расширить предел, если хотите).

1 голос
/ 25 января 2010

Это правильно в соответствии с действующим стандартом; шаблоны могут иметь только фиксированное количество аргументов, а библиотеки используют такие методы, как метапрограммирование препроцессора, для имитации параметров шаблона с переменным числом вплоть до определенного заданного максимума. Обычно это не представляет большой проблемы на практике, поскольку максимумы установлены так, что они значительно превышают то, что используют большинство людей.

В новом стандарте 0x есть поддержка истинных параметров шаблона переменной.

...