наследование от базы enable_if - PullRequest
6 голосов
/ 12 сентября 2011

Я пытаюсь частично специализировать черту для массивов без символов:

template<typename T>
struct is_container : std::false_type {};

template<typename T, unsigned N>
struct is_container<T[N]>
: std::enable_if<!std::is_same<T, char>::value, std::true_type>::type {};

Visual Studio 2010 дает мне C2039 (type не является элементом enable_if ...). Тем не менее, разве SFINAE не должен просто опускаться здесь вместо того, чтобы выдавать ошибку компилятора? Или SFINAE не применяется в этом случае?

Конечно, я мог бы просто разделить специализации на non-char и char:

template<typename T>
struct is_container : std::false_type {};

template<typename T, unsigned N>
struct is_container<T[N]> : std::true_type {};

template<unsigned N>
struct is_container<char[N]> : std::false_type {};

Но мне бы очень хотелось знать, почему SFINAE не работает в данном конкретном случае.

1 Ответ

2 голосов
/ 12 сентября 2011

Проверьте тему «3.1 Включение специализаций класса шаблона» в http://www.boost.org/doc/libs/1_47_0/libs/utility/enable_if.html

Редактировать: если ссылка на boost.org умирает ...

3.1 Включение специализаций класса шаблона Специализации шаблонов классов можно включить или отключить с помощью enable_if. Для выражений enabler необходимо добавить один дополнительный параметр шаблона. Этот параметр имеет значение по умолчанию void. Например:

template <class T, class Enable = void> 
class A { ... };

template <class T>
class A<T, typename enable_if<is_integral<T> >::type> { ... };

template <class T>
class A<T, typename enable_if<is_float<T> >::type> { ... };

Создание экземпляра A с любым целочисленным типом соответствует первой специализации, тогда как любой тип с плавающей запятой соответствует второй. Все остальные типы соответствуют первичному шаблону. Условием может быть любое логическое выражение времени компиляции, которое зависит от аргументов шаблона класса. Обратите внимание, что второй аргумент для enable_if снова не нужен; по умолчанию (void) правильное значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...