标准库中没有 std::identity 有啥原因吗?

Posted

技术标签:

【中文标题】标准库中没有 std::identity 有啥原因吗?【英文标题】:Is there a reason why there is not std::identity in the standard library?标准库中没有 std::identity 有什么原因吗? 【发布时间】:2016-06-24 18:53:53 【问题描述】:

在处理 C++ 中的泛型代码时,我会发现 std::identity 函子(如 std::negate)非常有用。标准库中不存在这是否有特殊原因?

【问题讨论】:

它出现在 C++11 之前的草稿中。 IIRC,它用于防止std::forward 中的模板参数推导。在此过程中,有人意识到forward 需要remove_reference,它还处理了不可演绎的上下文部分,也许identity 不再被其他任何东西使用,所以它被丢弃了。 有趣的是,一些 C++ 实现似乎在内部使用了 std::_Identity 模板。 【参考方案1】:

在引入 std::identity 后不久,问题开始出现,首先是与 cpp98 之前的 std::identity 定义发生冲突,表现为扩展:https://groups.google.com/a/isocpp.org/forum/#!topic/std-proposals/vrrtKvA7cqo 这个网站可能会提供更多的历史。

【讨论】:

标识可用于防止模板参数推导。 Boost::clamp 使用了这个技巧。另请参阅***.com/questions/41767240/…。【参考方案2】:

从 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());

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

【讨论】:

以上是关于标准库中没有 std::identity 有啥原因吗?的主要内容,如果未能解决你的问题,请参考以下文章

json 和 simplejson Python 模块有啥区别?

接口常量有啥用?

C++:模板的非推断语境与std::type_identity

Python,枚举类型有啥用? [复制]

为啥 C++ 标准库中没有线程池?

为啥 Python 的标准库中没有排序容器?