我试图弄清楚如何编写一个概念来检查可变参数模板中没有重复的类型。
我知道我不能在其内部递归地调用一个概念,但如果可以的话,我的解决方案将如下所示(忽略缺乏停止条件):
#include <concepts>
template <class TYPE, class ... TYPE_LIST>
concept is_not_in_list = ((!std::same_as<TYPE, TYPE_LIST>) && ...);
template <class FIRST_TYPE_IN_LIST, class ... REST_OF_TYPE_LIST>
concept is_non_repeating_list_ = (_type_not_in_list_<FIRST_TYPE_IN_LIST, REST_OF_TYPE_LIST> && is_non_repeating_list<REST_OF_TYPE_LIST>);
// Usage
template<is_non_repeating_list ... TYPE_LIST>
class MyClass {}
我在标准库中找不到类型特征或概念来帮助我解决这个问题。有什么想法吗?
您可能尝试解决此问题的大多数方法都无法根据类型列表的长度进行缩放 - 编译时间将是二次或更糟,并且天真地遍历包而不是使用折叠表达式很容易使包的长度成为立方。
这是在编译时执行此操作的一种方法,该方法仅随包长度线性增长,假设std::make_index_sequence<N>
最坏情况下是线性的N
:
#include <utility>
template<typename T> struct type_base {};
template<int N, typename T> struct indexed_type_base : type_base<T> {};
template<typename Indexes, typename ...T> struct indexed_types;
template<std::size_t ...Indexes, typename ...T>
struct indexed_types<std::index_sequence<Indexes...>, T...> : indexed_type_base<Indexes, T>... {};
template<typename ...T>
concept is_non_repeating_list =
std::is_standard_layout_v<indexed_types<std::make_index_sequence<sizeof...(T)>, T...>>;
这里的技巧是indexed_types
是标准布局类类型当且仅当其所有基类都是不同类型时,当且仅当类型包不包含重复项时才会发生这种情况。基类的索引序列和额外层仅用于避免indexed_types
包含重复的直接基类,这是格式错误的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)