给定一个可变参数模板参数包,我想检查使用inline constexpr bool和折叠表达式给出的所有类型是否唯一.我喜欢这样的东西:
template<class... T>
inline static constexpr bool is_unique = (... && (!is_one_of<T, ...>));
Run Code Online (Sandbox Code Playgroud)
is_one_of类似的bool 在哪里正常工作.但是无论我将什么放入is_one_of,这一行都无法编译.甚至可以使用折叠表达式来完成,还是我需要为此目的使用常规结构?
我正在尝试编写一个元函数来检查作为可变参数模板参数传递的所有类型是否都是不同的.似乎最高效的方法是从一组类继承并检测是否存在错误.
问题是编译在以下代码中失败,而我希望SFINAE能够工作.
编辑.问题不是"如何编写该元函数",而是"如何false_type在发生时捕获双重继承错误和输出".AFAIK,只有SFINAE才有可能.
template <typename T>
struct dummy {};
// error: duplicate base type ‘dummy<int>’ invalid
template <typename T, typename U>
struct fail : dummy<T>, dummy<U> {};
template <typename T>
true_type test(fail<T, T> a = fail<T, T>());
false_type test(...);
int main() {
cout << decltype(test<int>())::value << endl;
}
Run Code Online (Sandbox Code Playgroud)
现场版.
编辑.以前我曾尝试使用特殊化失败来做到这一点,但它在使用相同的编译错误时也无法正常工作.
template <typename T>
struct dummy {};
template <typename T, typename U>
struct fail : dummy<T>, dummy<U>, true_type {};
template <typename T, typename U = void> …Run Code Online (Sandbox Code Playgroud)