什么是std :: identity以及如何使用它?

时间:2017-01-20 15:34:38

标签: c++ template-meta-programming

我只是想知道std :: identity的目的是什么?我在网上找不到任何有用的东西。我知道它是如何实现的:

template <typename T>
struct identity
{
    T operator()(T x) const { return x; }
};

为什么我们真的需要这个?

5 个答案:

答案 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提案。 HereRanges 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);
        }
    };