Развертывание шаблонных структур - PullRequest
0 голосов
/ 18 октября 2018

Я пытаюсь создать структуру variant, то есть структуру, которая содержит один из очень многих типов.Вот моя попытка:

template <typename Type, typename... Rest> struct OneOf {
    union {
        Type value;
        OneOf<Rest...> rest;
    };
};

template <typename Type> struct OneOf {
    Type value;
};

К сожалению, это не компилируется.Когда я пытаюсь создать его экземпляр, я получаю:

one_of.h: 34: 33: ошибка: повторно объявлено с 1 параметром шаблона. Struct OneOf {

Есть лиспособ завершить рекурсию со ссылками на себя с помощью структур?

Ответы [ 3 ]

0 голосов
/ 18 октября 2018

Я предполагаю, что вы пытаетесь написать специализацию.

Это синтаксис:

template <typename Type> struct OneOf<Type> {
//                                   ^~~~~~
    Type value;
};
0 голосов
/ 19 октября 2018

Вы должны сначала объявить первичный шаблон , а затем объявить любые специализации (полные или частичные).Основной шаблон определяет количество и тип аргументов шаблона.Когда придет время создать экземпляр шаблона, будет использована полная специализация, если он точно совпадает, или наилучшая частичная специализация, если есть совпадение, в противном случае будет создан экземпляр основного шаблона.

Если вы хотите *Если 1007 * будет шаблоном, который принимает любое количество аргументов шаблона типа (0 или более), то вы должны соответственно объявить основной шаблон:

template <class... T> struct OneOf;

Тогда вам понадобятся две специализации: одна для базыслучай рекурсии, который можно принять за пустой пакет:

template <>
struct OneOf<> {};

и один для рекурсивного случая, по крайней мере с одним параметром шаблона:

template <typename Type, typename... Rest> struct OneOf<Type, Rest...> {
    union {
        Type value;
        OneOf<Rest...> rest;
    };
};

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

0 голосов
/ 18 октября 2018

А как насчет

template <typename...>
struct OneOf;

template <typename Type, typename... Rest>
struct OneOf<Type, Rest...> {
    union {
        Type value;
        OneOf<Rest...> rest;
    };
};

template <>
struct OneOf<> {
};

?

O также

template <typename, typename...>
struct OneOf;

template <typename T0, typename T1, typename ... Ts>
struct OneOf<T0, T1, Ts...> {
    union {
        T0 value;
        OneOf<T1, Rest...> rest;
    };
};

template <typename T0>
struct OneOf<T0> {
    T0 value;
};

?

...