Я пытаюсь написать метафункцию, которая проверяет, все ли типы, переданные в качестве вариативного параметра шаблона, различны. Кажется, что наиболее эффективный способ сделать это — наследовать от набора классов и определить, есть ли ошибка.
Проблема в том, что в следующем коде происходит сбой компиляции, хотя я ожидаю, что 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;
}
Изменить. Раньше я пытался сделать это с ошибкой специализации, но это не сработало с той же ошибкой компиляции.
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 {};
T
иU
, вы можете использоватьstd::is_same<T, U>::value
. если вам нужен вариативный шаблон, это сложнее. - person Jarod42   schedule 05.06.2014