标准库中没有std::identity有什么原因吗? 在C++中处理泛型代码时,我会发现一个 STD::Id/函子(类似 STD::NuxATA//COD>)非常有用。标准库中没有这一点有什么特别的原因吗?

标准库中没有std::identity有什么原因吗? 在C++中处理泛型代码时,我会发现一个 STD::Id/函子(类似 STD::NuxATA//COD>)非常有用。标准库中没有这一点有什么特别的原因吗?,c++,function,c++11,identity,negate,C++,Function,C++11,Identity,Negate,在引入std::identity后不久,问题开始出现,首先是std::identity在cpp98之前的定义出现了冲突,这些定义显示为扩展: 此站点可能会提供更多的历史记录。自C++20以来,有一种带有操作符()的函子类型。模板成员函数。此函数调用运算符返回其参数 例如,如果您有这样一个函数模板: template<typename T, typename Operation> void print_collection(const T& coll, Operation o

在引入std::identity后不久,问题开始出现,首先是std::identity在cpp98之前的定义出现了冲突,这些定义显示为扩展: 此站点可能会提供更多的历史记录。

自C++20以来,有一种带有
操作符()的函子类型。
模板成员函数。此函数调用运算符返回其参数


例如,如果您有这样一个函数模板:

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';
}
您可以执行以下操作:

print_collection(vec, [](auto val) { return val; });
使用
std::identity
,您可以执行以下操作:

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

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

它出现在C++11之前的草稿中。IIRC中,它用于防止模板参数推断。在途中的某个地方,有人意识到
remove\u reference
forward
所需要的,它还负责不可推断的上下文部分,可能
identity
不再被其他任何东西使用,所以它被丢弃了。有趣的是,有些C++实现似乎在内部使用了 STD::YixIdIs/Outo>模板。身份可以用来防止模板参数推导。clamp使用了这个技巧。另见。
print_collection(vec, std::identity());