这是一个代码片段,我将使用它来检查可变参数模板类型是否是唯一的:
templatestruct is_one_of; template struct is_one_of { static constexpr bool value = false; }; template struct is_one_of { static constexpr bool value = std::is_same ::value || is_one_of ::value; }; template struct is_unique; template <> struct is_unique<> { static constexpr bool value = true; }; template struct is_unique { static constexpr bool value = is_unique ::value && !is_one_of ::value; }; int main() { constexpr bool b = is_unique ::value; constexpr bool c = is_unique ::value; static_assert(b == true && c == false, "!"); }
有没有办法使用C++ 14和C++ 1z中引入的功能使这段代码更短和/或更简洁?或者是否有更好的方法来使用新功能实现相同的效果?
在C++ 1z的情况下,我的意思是:最新版本的Clang和GCC中已有的功能.
我们最近将std :: disjunction添加到了C++ 1z草案中,它可以用于is_one_of
(并且一旦找到匹配就停止实例化,请参阅链接以获取更多详细信息):
templateusing is_one_of = std::disjunction ...>;
这已在GCC主干中实现.对于旧版本的GCC,您可以使用实现细节__or_
:
templateusing is_one_of = std::__or_ ...>;
或者disjunction
使用C++ 11工具手动实现,如上面链接的提案末尾所示.
#includetemplate constexpr bool is_one_of = (std::is_same {} || ...); template constexpr bool is_unique = true; template constexpr bool is_unique = is_unique && !is_one_of ;
DEMO