解开可变参数模板结构

时间:2018-10-18 20:55:44

标签: c++ c++11 variadic-templates template-meta-programming template-specialization

我正在尝试创建一个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 :(得分:2)

您必须首先声明主模板,然后声明任何专业化(全部或部分)。主模板确定模板参数的数量和种类。当需要实例化模板时,如果完全匹配,将使用完全专业化,如果匹配,则使用最匹配的部分专业化,否则将实例化主模板。

如果您希望OneOf成为采用任意数量的类型模板参数(0或更多)的模板,则应相应地声明主模板:

template <class... T> struct OneOf;

然后,您将需要两个专业化:一个用于递归的基本情况,可以将其视为空包:

template <>
struct OneOf<> {};

,一个用于递归情况,至少具有一个模板参数:

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

请注意,完全专业化和部分专业化都需要在模板名称后添加模板参数列表。如果您忽略此选项,编译器会认为您正在重新声明主模板,这会导致您看到错误。

答案 1 :(得分:1)

我认为您正在尝试写专业化课程。

这是语法:

>OSBS_087-M-32-18-20140227-gen
TCCCTTGTCTCC
>OSBS_048-M-37-33-20140227-gen
ACGAGACTGATT
>OSBS_048-M-15-31-20140227-gen
GCTGTACGGATT
>OSBS_047-M-20-3-20140227-gen
ATCACCAGGTGT
>OSBS_119-M-18-38-20140227-gen
TGGTCAACGATA
>OSBS_047-M-22-36-20140227-gen
ATCGCACAGTAA
>OSBS_087-M-40-21-20140227-gen
GTCGTGTAGCCT
>OSBS_048-M-5-11-20140227-gen
AGCGGAGGTTAG
>OSBS_119-M-27-5-20140227-gen
ATCCTTTGGTTC

答案 2 :(得分:0)

stick-table type integer size 1k expire 5m

template <typename...>
struct OneOf;

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

template <>
struct OneOf<> {
};