#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>
помощью (также может быть исправлено с помощью preferredstd::enable_if_t<cond, int> = 0
) - Ваш класс в любом случае не будет дружественным к SFINAE, так что жесткая ошибка допускает пользовательское сообщение.
- Более простой синтаксис 🙂
Комментарии:
1. Ваш ответ сработал для меня, во всяком случае, я сейчас думаю об использовании
static_assert
.