在处理C++中的通用代码时,我会发现一个名为`std::identity`的函数对象(类似于`std::negate`)非常有用。这个标准库中没有提供这个函数对象,是否有特别的原因呢?
在std::identity被引入后不久,问题开始出现,首先是与cpp98之前的std::identity定义冲突,导致其出现扩展:https://groups.google.com/a/isocpp.org/forum/#!topic/std-proposals/vrrtKvA7cqo 这个网站可能会提供更多的历史信息。
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; });
print_collection(vec, std::identity());
identity
存在。据我回忆,它用于防止在std::forward
中进行模板参数推导。后来有人意识到forward
需要remove_reference
,这也解决了不可推导上下文的部分问题,可能identity
不再被其他任何东西使用,因此它被删除了。 - Praetorianstd::_Identity
模板。 - JAB