我只是想知道std :: identity的目的是什么?我在网上找不到任何有用的东西。我知道它是如何实现的:
template <typename T>
struct identity
{
T operator()(T x) const { return x; }
};
为什么我们真的需要这个?
答案 0 :(得分:2)
代码中的结构是标识函数T -> T
,其中T是模板参数。此函数本身没有用,但在需要传递函数参数的其他上下文中可能很有用,而识别函数是您想要插入的函数。它通常可用作一种“无所事事”的功能。
至于std::identity
,我发现没有证据表明这个结构存在于C ++标准库中。
答案 1 :(得分:2)
标准版(最高为C ++ 20)没有std::identity
,所有提及它的提案都已删除。最初建议的时候,它应该与std::forward
在接受标准中服务的目的相同,但它与非标准扩展冲突并且在最后删除了几次迭代之后。
C ++ 20有std::identity
返回:https://en.cppreference.com/w/cpp/utility/functional/identity
答案 2 :(得分:1)
尽管在提出问题时不相关,但C ++ 20添加了std::identity
,这似乎来自Ranges
提案。 Here是Ranges TS
之前的定义,其主要用法解释为:
它用作所有Ranges TS算法的默认投影。
答案 3 :(得分:0)
我的库中没有std::identity
,但它应该是一个有用的工具,可以通过nullptr
将矢量复制到另一个没有std::copy_if
个对象的矢量中。
答案 4 :(得分:0)
其他人已经回答了这个问题——它对于函数类型模板参数的默认以及haskell风格的函数式编程等很有用。
但是您的示例实现不正确。您的代码将执行值复制,而 std::identity
不会这样做 - 它完美地转发。它也是 constexpr
并且是透明的。
所以这个是一个如何实施的例子,我相信:
struct identity
{
using is_transparent = void;
template <typename T>
constexpr T&& operator()(T&& t) const noexcept
{
return std::forward<T>(t);
}
};