шаблон класса SFINAE - PullRequest
       49

шаблон класса SFINAE

1 голос
/ 24 апреля 2020

Я тестирую шаблон класса SFINAE.

template<typename T, typename...Types>
using enable_if_class = T;

template<typename T, typename...Types>
struct enable_if_test;

template<typename T>
struct enable_if_test<T, enable_if_class<T, typename std::enable_if<std::is_const<T>::value, int>::type>> {
    enable_if_test() {
        std::cout << "const version!\n";
    }
};

template<typename T>
struct enable_if_test<T, enable_if_class<T, typename std::enable_if<!std::is_const<T>::value, int>::type>> {
    enable_if_test() {
        std::cout << "nonconst version!\n";
    }
};

вышеприведенные коды компилируются на g ++, но выдают ошибку на clang ++ и visual studio. когда коды изменяются на:

template<typename T, typename...Types>
using enable_if_class = T;

template<typename T, typename...Types>
struct enable_if_test;

template<typename T>
struct enable_if_test<T, enable_if_class<void, typename std::enable_if<std::is_const<T>::value, int>::type>> {
    enable_if_test() {
        std::cout << "const version!\n";
    }
};

template<typename T>
struct enable_if_test<T, enable_if_class<void, typename std::enable_if<!std::is_const<T>::value, int>::type>> {
    enable_if_test() {
        std::cout << "nonconst version!\n";
    }
};

, на этот раз только g ++ получает ошибку. так вот мой вопрос, это ошибка компилятора или мой код является незаконным? если это ошибка компилятора, есть ли какая-то причина, по которой эта ошибка возникает?

Ответы [ 2 ]

0 голосов
/ 24 апреля 2020

Кажется, ошибка clang / msv c похожа на CWG ( 1558 ), обнаруженную std::void_t, используя:

template<typename T, typename...Types>
struct enable_if_class_impl
{
    using type = T;
};

template<typename T, typename...Types>
using enable_if_class = typename enable_if_class_impl<T, Types...>::type;

радует всех компиляторов:

Демо (T)

Демо (void)

0 голосов
/ 24 апреля 2020

В G CC это ошибка компилятора, видимая в версии 4.9.4 и ниже и исправленная в версии 5.1.

G CC 4.9.4 Демонстрация

G CC 5.1 Демо

Я бы предложил вам использовать более новую версию G CC или CLANG.

...