Есть ли причина, по которой в стандартной библиотеке нет 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());
Строка выше, кажется, более четко определяет это намерение.