c – 使用折叠表达式检查可变参数模板参数是否唯一

给定一个可变参数模板参数包,我想检查给定的所有类型是否使用内联constexpr bool和 fold expressions是唯一的.我是这样的:
template<class... T>
inline static constexpr bool is_unique = (... && (!is_one_of<T,...>));

其中is_one_of是一个正常工作的类似bool.
但是无论我将什么放入is_one_of,这一行都无法编译.甚至可以使用折叠表达式来完成,还是我需要为此目的使用常规结构?

解决方法

你的方法并不真正有效,因为需要使用类型T调用is_one_of,而不包括T的所有其余类型.没有办法在单个参数包中使用折叠表达式表达.我建议使用专业化:
template <typename...>
inline constexpr auto is_unique = std::true_type{};

template <typename T,typename... Rest>
inline constexpr auto is_unique<T,Rest...> = std::bool_constant<
    (!std::is_same_v<T,Rest> && ...) && is_unique<Rest...>
>{};

用法

static_assert(is_unique<>);
static_assert(is_unique<int>);
static_assert(is_unique<int,float,double>);
static_assert(!is_unique<int,double,int>);

live example on wandbox.org

(感谢Barry的简化,使用折叠表达式.)

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...