标准库中没有 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 模块有啥区别?