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;
};