Есть ли причина, по которой в стандартной библиотеке нет std::identity?

При работе с общим кодом на C++ я бы нашел std::identity функтор (как std::negate) очень полезно. Есть ли конкретная причина, почему этого нет в стандартной библиотеке?

1 ответ

Решение

Вскоре после введения std::identity стали появляться проблемы, начиная с конфликтов с пре-cpp98 определениями std::identity, появляющимися как расширения: https://groups.google.com/a/isocpp.org/forum/ Этот сайт может дать немного больше истории для него.

Начиная с C++20, существует std::identity тип функтора с operator()функция-член шаблона. Этот оператор вызова функции возвращает свой аргумент.


Например, если у вас есть такой шаблон функции:

template<typename T, typename Operation>
void print_collection(const T& coll, Operation op) {
    std::ostream_iterator<typename T::value_type> out(std::cout, " ");
    std::transform(std::begin(coll), std::end(coll), out, op);
    std::cout << '\n';
}

и хотел напечатать элементы vec:

std::vector vec = {1, 2, 3};

вы бы сделали что-то вроде:

print_collection(vec, [](auto val) { return val; });

С участием std::identity, вы могли бы сделать:

print_collection(vec, std::identity());

Строка выше, кажется, более четко определяет это намерение.

Другие вопросы по тегам