C++ 为可变模板编写基本案例

C++ 为可变模板编写基本案例,c++,c++11,variadic-templates,C++,C++11,Variadic Templates,我正在实现一个编译时过滤器,它基本上只是获取枚举的编译时向量(一个可变参数包),对其进行迭代,并尝试查找向量中是否包含某个枚举 假设我们有枚举: enum Color { red, green, purple, blue, pink, yellow }; 以及一个结构excluded_enums,它只是我们要排除的枚举的编译时向量: template <Color... ExcludedValues> struct exclude_enums { }; 问

我正在实现一个编译时过滤器,它基本上只是获取枚举的编译时向量(一个可变参数包),对其进行迭代,并尝试查找向量中是否包含某个枚举

假设我们有枚举:

enum Color
{
  red,
  green,
  purple,
  blue,
  pink,
  yellow
};
以及一个结构
excluded_enums
,它只是我们要排除的枚举的编译时向量:

template <Color... ExcludedValues>
struct exclude_enums
{ };
问题是编译器(GCC4.7)不喜欢我的基本情况。它失败于:

内部编译器错误:进程中的部分专用化,位于 cp/pt.c:4414

起初,我认为这可能是一个编译器错误,因为变量模板现在仍然是新的。但是,这似乎表明,尽管错误消息不是很有帮助,但GCC拒绝这一点是正确的,因为部分专门化并不比主模板更专门,因为它用包扩展替换多个参数

好的,所以我试图通过包含一个额外的“count”参数,让它认为基本情况更专业化,这是变量参数包中剩余的参数数:

template <std::size_t NumArgs, Color Test, Color Head, Color... Tail>
struct is_excluded_impl
{ 
  static const bool value = (Test == Head ? true : is_excluded_impl<sizeof...(Tail), Test, 
    Tail...>::value);
};

template <Color Test, Color... Tail>
struct is_excluded_impl<0, Test, Tail...> 
{ 
   static const bool value = false;
};
模板
结构被排除在外\u impl
{ 
静态常量布尔值=(Test==Head?true:是否已排除\u impl::value);
};
模板
结构被排除在外\u impl
{ 
静态常量布尔值=假;
};

但这失败了,并且出现了同样的错误。那么,这是一个编译器错误吗?如果没有,我如何编写一个适当的基本情况来终止模板递归?

用一个变量包来声明主模板:

template <Color...>
struct is_excluded_impl : std::false_type {};

template <Color Test, Color Head, Color... Tail>
struct is_excluded_impl<Test, Head, Tail...>
{
    static const bool value =
        Head == Test || is_excluded_impl<Test, Tail...>::value;
};
模板
结构被排除在外\u impl:std::false\u类型{};
模板
结构被排除在外\u impl
{
静态常数布尔值=
Head==测试| |被_排除_impl::value;
};
template <Color...>
struct is_excluded_impl : std::false_type {};

template <Color Test, Color Head, Color... Tail>
struct is_excluded_impl<Test, Head, Tail...>
{
    static const bool value =
        Head == Test || is_excluded_impl<Test, Tail...>::value;
};