我正在尝试编写一个元函数来检查作为可变参数模板参数传递的所有类型是否不同。似乎执行此操作的最有效方法是从一组类继承并检测是否存在错误。
问题是下面的代码编译失败,而我希望 SFINAE 能够工作。
Edit.问题不是“如何编写该元函数”,而是“如何捕获双重继承错误并输出false_type
当它发生时”。据我所知,只有 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;
}
现场版本在这里 http://ideone.com/22S50k.
Edit.以前我曾尝试在专业化失败的情况下执行此操作,但它也无法在相同的编译错误下工作。
template <typename T>
struct dummy {};
template <typename T, typename U>
struct fail : dummy<T>, dummy<U>, true_type {};
template <typename T, typename U = void>
struct test : false_type {};
template <typename T>
struct test<T, typename enable_if<fail<T, T>::value, void>::type> : true_type {};
现场版本在这里。 http://ideone.com/QN0SVE