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

std::placeholders::_1, std::placeholders::_2, ..., std::placeholders::_N

Материал из cppreference.com
 
 
Библиотека утилит
Языковая поддержка
Поддержка типов (базовые типы, RTTI)
Макросы тестирования функциональности библиотеки (C++20)    
Управление динамической памятью
Программные утилиты
Поддержка сопрограмм (C++20)
Вариативные функции
Трёхстороннее сравнение (C++20)
(C++20)
(C++20)(C++20)(C++20)(C++20)(C++20)(C++20)
Общие утилиты
Дата и время
Функциональные объекты
Библиотека форматирования (C++20)
(C++11)
Операторы отношения (устарело в C++20)
Целочисленные функции сравнения
(C++20)(C++20)(C++20)    
(C++20)
Операции обмена и типа
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
Общие лексические типы
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)
Элементарные преобразования строк
(C++17)
(C++17)
 
Объекты функции
Функции обёртки
(C++11)
(C++11)
Применение частичных функций
(C++20)(C++23)
(C++11)
Вызов функции
(C++17)(C++23)
Объект идентичности функции
(C++20)
Обёртки ссылок
(C++11)(C++11)
Прозрачные обёртки операторов
(C++14)
(C++14)
(C++14)
(C++14)  
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)

Отрицатели
(C++17)
Искатели
Ограниченные компараторы
Старые привязки и адаптеры
(до C++17*)
(до C++17*)
(до C++17*)
(до C++17*)
(до C++17*)(до C++17*)(до C++17*)(до C++17*)
(до C++20*)
(до C++20*)
(до C++17*)(до C++17*)
(до C++17*)(до C++17*)

(до C++17*)
(до C++17*)(до C++17*)(до C++17*)(до C++17*)
(до C++20*)
(до C++20*)
 
<tbody> </tbody>
Определено в заголовочном файле <functional>
/*смотрите ниже*/ _1; /*смотрите ниже*/ _2; . . /*смотрите ниже*/ _N;

Пространство имён std::placeholders содержит объекты-заполнители [_1, ..., _N] где N это максимальное число, определённое реализацией.

При использовании в качестве аргумента в выражении std::bind объекты-заполнители сохраняются в сгенерированном функциональном объекте, а когда этот объект функция вызывается с непривязанными аргументами, каждый заполнитель _N заменяется соответствующим N-м непривязанным аргументом.

Каждый заполнитель объявляется как extern /*неопределено*/ _1;

(до C++17)

В реализациях рекомендуется объявлять заполнители как inline constexpr /*неопределено*/ _1;, хотя объявление их как extern /*неопределено*/ _1; по-прежнему разрешено стандартом.

(начиная с C++17)

Типы объектов-заполнителей: DefaultConstructible и CopyConstructible, их конструкторы копирования/перемещения по умолчанию не вызывают исключений, и для любого заполнителя _N, определён тип std::is_placeholder<decltype(_N)>, где std::is_placeholder<decltype(_N)> получен из std::integral_constant<int, N>.

Пример

В следующем коде показано создание объектов функций с аргументами-заполнителями.

#include <functional>
#include <iostream>
#include <string>

void goodbye(const std::string& s)
{
    std::cout << "До свидания " << s << '\n';
}

class Object {
public:
    void hello(const std::string& s)
    {
        std::cout << "Привет " << s << '\n';
    }
};

int main()
{
    using namespace std::placeholders;

    using ExampleFunction = std::function<void(const std::string&)>;
    Object instance;
    std::string str("Мир");

    ExampleFunction f = std::bind(&Object::hello, &instance, _1);
    f(str);  // эквивалентно instance.hello(str)

    f = std::bind(&goodbye, std::placeholders::_1);
    f(str);  // эквивалентно goodbye(str)

    auto lambda = [](std::string pre, char o, int rep, std::string post) {
        std::cout << pre;
        while (rep-- > 0) std::cout << o;
        std::cout << post << '\n';
    };

    // приязка лямбды:
    std::function<void(std::string, char, int, std::string)> g =
        std::bind(&decltype(lambda)::operator(), &lambda, _1, _2, _3, _4);
    g("G", 'o', 'o'-'g', "gol");
}

Вывод:

Привет Мир
До свидания Мир
Goooooooogol

Смотрите также

(C++11)
связывает один или несколько аргументов с объектом функцией
(шаблон функции) [править]
указывает, что объект является стандартным заполнителем или может использоваться самостоятельно
(шаблон класса) [править]
(C++11)
заполнитель для пропуска элемента при распаковке tuple с помощью tie
(константа) [править]