std::is_bind_expression
| Определено в заголовочном файле <functional>
|
||
template< class T > struct is_bind_expression; |
(начиная с C++11) | |
Если T является типом, созданным вызовом std::bind (но не std::bind_front или std::bind_front), этот шаблон является производным от std::true_type. Для любого другого типа (если не специализирован пользователем) этот шаблон является производным от std::false_type.
Этот шаблон может быть специализирован для определяемого пользователем типа T для реализации UnaryTypeTrait с базовой характеристикой объекта std::true_type, чтобы указать, что T должен обрабатываться std::bind так, как если бы он был типом подвыражения привязки: когда вызывается функциональный объект, сгенерированный привязкой, будет вызван связанный аргумент этого типа, как объект функции, и ему будут переданы все несвязанные аргументы, переданные объекту, сгенерированному привязкой.
Шаблон вспомогательной переменной
<tbody> </tbody> template< class T > inline constexpr bool is_bind_expression_v = is_bind_expression<T>::value; |
(начиная с C++17) | |
Унаследован от std::integral_constant
Константы элементы
value [static] |
true, если T это объект функции, сгенерированный std::bind, false иначе (public static константа-элемент) |
Функции-элементы
operator bool |
преобразует объект в bool, возвращает value (public функция-элемент) |
operator() (C++14) |
возвращает value (public функция-элемент) |
Типы элементы
| Тип | Определение |
value_type
|
bool
|
type
|
std::integral_constant<bool, value>
|
Пример
#include <functional>
#include <iostream>
#include <type_traits>
struct MyBind {
typedef int result_type;
int operator()(int a, int b) const { return a + b; }
};
namespace std {
template<>
struct is_bind_expression<MyBind> : public true_type {};
}
int f(int n1, int n2)
{
return n1+n2;
}
int main()
{
// как будто bind(f, bind(MyBind(), _1, _2), 2)
auto b = std::bind(f, MyBind(), 2);
std::cout << "Прибавление 2 к сумме 10 и 11 даёт " << b(10, 11) << '\n';
}
Вывод:
Прибавление 2 к сумме 10 и 11 даёт 23
Отчёты о дефектах
Следующие изменения поведения были применены с обратной силой к ранее опубликованным стандартам C++:
| Номер | Применён | Поведение в стандарте | Корректное поведение |
|---|---|---|---|
| LWG 2010 | C++11 | определяемые пользователем специализации могут быть получены только из std::false_type |
могут быть получены из std::true_type |
Смотрите также
(C++11) |
связывает один или несколько аргументов с объектом функцией (шаблон функции) |