Struct, является фундаментальным шаблоном, C

#c #templates #std #primitive-types #enable-if

#c #шаблоны #std #примитивные типы #включить-если

Вопрос:

Я хочу проверить, является ли параметр шаблона структуры фундаментальным или нет. Итак, я создал структуру

 template<typename T, typename =  std::enable_if<std::is_fundamental_v<T>>>
struct Something {
};
 

И пустая структура

 struct AStruct{
};
 

Используя is_fundamental , я ожидал, что моя структура будет «включена» только и только в том случае, если параметр шаблона T является одним из основных типов, таких как long long int , float и другие…

Но когда я делаю специализацию, например

 using Defined = Something<AStruct>;
 

Он отлично компилируется, так что я пропустил? или что я сделал не так?

Ответ №1:

Это должно быть std::enable_if_t<std::is_fundamental_v<T>> (_t добавлено) или typename std::enable_if<std::is_fundamental_v<T>>::type .

Я бы предложил static_assert вместо этого:

  • избегайте перехвата с Something<AStruct, void> помощью (также может быть исправлено с помощью preferred std::enable_if_t<cond, int> = 0 )
  • Ваш класс в любом случае не будет дружественным к SFINAE, так что жесткая ошибка допускает пользовательское сообщение.
  • Более простой синтаксис 🙂

Комментарии:

1. Ваш ответ сработал для меня, во всяком случае, я сейчас думаю об использовании static_assert .