标准库中为什么没有std::identity函数?

8
在处理C++中的通用代码时,我会发现一个名为`std::identity`的函数对象(类似于`std::negate`)非常有用。这个标准库中没有提供这个函数对象,是否有特别的原因呢?

3
在C++11之前的草案中,identity存在。据我回忆,它用于防止在std::forward中进行模板参数推导。后来有人意识到forward需要remove_reference,这也解决了不可推导上下文的部分问题,可能identity不再被其他任何东西使用,因此它被删除了。 - Praetorian
有趣的是,一些C++实现似乎在内部使用std::_Identity模板。 - JAB
2个回答

2

Identity可以用于防止模板参数推导。Boost::clamp使用了这个技巧。另请参见https://dev59.com/_Z7ha4cB1Zd3GeqPimXU。 - gast128

1
自 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());

上面的那行似乎更清楚地说明了这个意图。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接