相关疑难解决方法(0)

使用`void_t`来检测多个继承类型的重复错误

我想实现一个has_no_duplicates<...>类型特征,评估std::true_type传递的可变参数类型列表是否没有重复类型.

static_assert(has_no_duplicates<int, float>{}, "");
static_assert(!has_no_duplicates<float, float>{}, "");
Run Code Online (Sandbox Code Playgroud)

让我们假设,对于这个问题的范围,我想使用多重继承来做到这一点.

当一个类多次从同一类型继承时,会发生错误.

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{};
Run Code Online (Sandbox Code Playgroud)

我以为我已经习惯于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 …
Run Code Online (Sandbox Code Playgroud)

c++ templates variadic-functions sfinae c++17

8
推荐指数
1
解决办法
338
查看次数

标签 统计

c++ ×1

c++17 ×1

sfinae ×1

templates ×1

variadic-functions ×1