Пространства имён
Варианты
Действия

std::enable_if

Материал из cppreference.com
< cpp‎ | types
 
 
 
Поддержка типов
Основные типы
Оригинал:
Basic types
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Основные типы
Исправлены типы целых ширину (C++11)
Числовые пределы
Оригинал:
Numeric limits
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
numeric_limits
С числовым ограничивает интерфейс
Время тип информации
Оригинал:
Runtime type information
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Тип черты
Оригинал:
Type traits
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Первичные категории типа
Оригинал:
Primary type categories
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
is_void(C++11)
is_array(C++11)
is_pointer(C++11)
is_enum(C++11)
is_union(C++11)
is_class(C++11)
is_function(C++11)
is_object(C++11)
is_scalar(C++11)
is_compound(C++11)
is_integral(C++11)
is_floating_point(C++11)
is_fundamental(C++11)
is_arithmetic(C++11)
is_reference(C++11)
is_lvalue_reference(C++11)
is_rvalue_reference(C++11)
is_member_pointer(C++11)
is_member_object_pointer(C++11)
is_member_function_pointer(C++11)
Тип свойства
Оригинал:
Type properties
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
is_const(C++11)
is_volatile(C++11)
is_pod(C++11)
is_empty(C++11)
is_polymorphic(C++11)
is_abstract(C++11)
Поддерживаемые операции
Оригинал:
Supported operations
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
is_constructible
is_trivially_constructible
is_nothrow_constructible
(C++11)
(C++11)
(C++11)
is_default_constructible
is_trivially_default_constructible
is_nothrow_default_constructible
(C++11)
(C++11)
(C++11)
is_copy_constructible
is_trivially_copy_constructible
is_nothrow_copy_constructible
(C++11)
(C++11)
(C++11)
is_move_constructible
is_trivially_move_constructible
is_nothrow_move_constructible
(C++11)
(C++11)
(C++11)
is_assignable
is_trivially_assignable
is_nothrow_assignable
(C++11)
(C++11)
(C++11)
is_copy_assignable
is_trivially_copy_assignable
is_nothrow_copy_assignable
(C++11)
(C++11)
(C++11)
is_move_assignable
is_trivially_move_assignable
is_nothrow_move_assignable
(C++11)
(C++11)
(C++11)
is_destructible
is_trivially_destructible
is_nothrow_destructible
(C++11)
(C++11)
(C++11)
has_virtual_destructor(C++11)
Отношения собственности и запросов
Оригинал:
Relationships and property queries
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
is_same(C++11)
is_base_of(C++11)
is_convertible(C++11)
alignment_of(C++11)
rank(C++11)
extent(C++11)
Тип модификаций
Оригинал:
Type modifications
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
remove_cv
remove_const
remove_volatile
(C++11)
(C++11)
(C++11)
add_cv
add_const
add_volatile
(C++11)
(C++11)
(C++11)
make_signed(C++11)
make_unsigned(C++11)
Тип преобразования
Оригинал:
Type transformations
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
aligned_storage(C++11)
aligned_union(C++11)
decay(C++11)
enable_if(C++11)
conditional(C++11)
common_type(C++11)
underlying_type(C++11)
result_of(C++11)
Введите черта констант
Оригинал:
Type trait constants
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
integral_constant(C++11)
 
Определено в заголовочном файле <type_traits>
template< bool B, class T = void >
struct enable_if;
(начиная с C++11)

Если B является true, std::enable_if имеет открытый член–typedef type, равный T, в противном случае type не определён.

Эта метафункция используется для условного удаления функций и классов, основываясь на статических свойств типов (type traits), и для предоставления разных перегруженных функций в зависимости от типов. std::enable_if может быть использована:

  • в качестве дополнительного аргумента функции (не применимо к перегруженным операторам),
  • в качестве возвращаемого типа (не применимо к конструкторам и деструкторам),
  • как параметр шаблона класса или функции.

Содержание

[править] Типы-члены

Тип Определение
type T или нет такого члена, в зависимости от значения B

[править] Возможная реализация

template<bool B, class T = void>
struct enable_if {};
 
template<class T>
struct enable_if<true, T> { typedef T type; };

[править] Примечание

Частая ошибка заключается в определении двух шаблонов функций, которые отличаются только значениями по умолчанию для их аргументов. Это неправильно, так как значения по умолчанию аргументов шаблона не являются частью сигнатуры шаблона, а объявление двух разных шаблонов функций с одной сигнатурой является ошибкой.

struct T {
    enum { int_t,float_t } m_type;
    template <typename Integer,
              typename = std::enable_if_t<std::is_integral<Integer>::value>
    >
    T(Integer) : m_type(int_t) {}
 
    template <typename Floating,
              typename = std::enable_if_t<std::is_floating_point<Floating>::value>
    >
    T(Floating) : m_type(float_t) {} // Ошибка: нельзя перегрузить
};


[править] Пример

#include <type_traits>
#include <iostream>
 
// Включение перегруженных вариантов foo1 при помощи возвращаемого типа
template<class T>
typename std::enable_if<std::is_floating_point<T>::value, T>::type
    foo1(T t)
{
    std::cout << "foo1: float\n";
    return t;
}
 
template<class T>
typename std::enable_if<std::is_integral<T>::value, T>::type
    foo1(T t)
{
    std::cout << "foo1: int\n";
    return t;
}
 
// Включение перегруженных вариантов foo2 при помощи дополнительного неиспользуемого параметра
template<class T>
T foo2(T t, typename std::enable_if<std::is_integral<T>::value >::type* = 0)
{
    return t;
}
 
// Включение перегруженных вариантов foo3 при помощи дополнительного параметра шаблона
template<class T ,
         class = typename std::enable_if<std::is_integral<T>::value>::type >
T foo3(T t) // обратите внимание, сигнатура функции не меняется
{
    return t;
}
 
// Включение объявления класса A при помощи дополнительного шаблонного параметра
template<class T, class Enable = void>
class A; // еще неопределенный (undefined) класс
 
template<class T>
class A<T, typename std::enable_if<std::is_floating_point<T>::value >::type> {
};
 
int main()
{
    foo1(1.2); // OK, будет вызвана первая версия foo1()
    foo1(10); // OK, будет вызвана вторая версия foo1()
 
//  foo2(0.1); // ошибка времени компиляции
    foo2(7); // OK
 
//  A<int> a1; // ошибка времени компиляции
    A<double> a1; // OK
}

Вывод:

foo1: float
foo1: int

[править] См. также

(C++17)
void псевдоним шаблонной переменной
(псевдоним шаблона) [править]