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