我正在尝试创建一个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 {
有没有办法终止使用结构的自引用递归?
答案 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<> {
};
?