我想实现一个has_no_duplicates<...>
类型特征来评估std::true_type
传递的可变参数类型列表是否没有重复类型。
static_assert(has_no_duplicates<int, float>{}, "");
static_assert(!has_no_duplicates<float, float>{}, "");
让我们假设,对于这个问题的范围,我想使用多重继承来做到这一点。
当一个类多次继承同一个类型时,就会发生错误。
template<class T>
struct type { };
template<class... Ts>
struct dup_helper : type<Ts>... { };
// No errors, compiles properly.
dup_helper<int, float> ok{};
// Compile-time error:
// base class 'type<float>' specified more than once as a direct base class
dup_helper<float, float> error{};
我以为我可以用来void_t
“检测”这个错误,但是我无法按照 cppreference 中的代码示例实现有效的解决方案。
这是我尝试过的:
template<class, class = void>
struct is_valid
: std::false_type { };
// First try:
template<class T>
struct is_valid<T, std::void_t<decltype(T{})>>
: std::true_type { };
// Second try:
template<class T>
struct is_valid<T, std::void_t<T>>
: std::true_type { };
对于我的第三次尝试,我尝试延迟使用作为模板模板参数dup_helper<...>
的包装类的扩展,例如并在.dup_helper
wrapper<dup_helper, ...>
void_t
不幸的是,我所有的尝试都导致上述错误总是阻止编译。
我认为这种类型的错误不能检测为“替换失败”,但我想确认一下。
这种错误实际上是无法检测到的void_t
吗?(会不会总是导致编译失败?)
有没有办法在不导致编译失败的情况下检测它?void_t
(或者仍然使用“多重继承技巧”的非解决方法)?