<分区>
考虑下面的 C++ 17 代码,它测试一组枚举值以查看该组中是否包含另一个枚举值:
enum Flag { val1, val2, val3, val4, val5 };
template<Flag arg> struct Value {
template<Flag... set> struct IsIn {
static constexpr bool value =
static_cast<bool>(((set == arg) || ...));
};
};
这按预期工作:
bool x = Value<val4>::IsIn<val1, val2, val5>::value;
// x == false
bool y = Value<val2>::IsIn<val3, val2>::value;
// y == true
但是,我想测试是否所有一组值都包含在另一组中,如下所示:
template<Flag... args> struct Values {
template<Flag... set> struct AreIn {
static constexpr bool value =
static_cast<bool>((Value<args>::IsIn<set...>::value && ...));
};
};
以上代码无法在 GCC 7.3 或 Clang 5.0 上编译;他们都给出了相当隐晦的答案,几乎没有深入了解问题。鉴于模板参数列表中的参数包扩展是允许的(只要模板支持扩展),我很难弄清楚为什么这不是合法的 C++。