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

MEM*_*EMS 5 c++ template-meta-programming

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

template <typename T>
struct identity
{
    T operator()(T x) const { return x; }
};
Run Code Online (Sandbox Code Playgroud)

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

had*_*iel 5

其他人已经回答了这个问题 - 它对于诸如函数类型模板参数的默认值以及 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);
        }
    };
Run Code Online (Sandbox Code Playgroud)


Cub*_*bic 2

代码中的结构是恒等函数,T -> T其中 T 是模板参数。该函数本身并没有什么用处,但在您需要传递函数参数并且识别函数是您想要插入其中的函数的其他上下文中可能很有用。它通常作为一种“不执行任何操作”的功能很有用。

至于std::identity,我找不到任何证据表明该结构存在于 C++ 标准库中。

  • 从模板参数推导中排除参数非常有用。Cppreference 在 http://en.cppreference.com/w/cpp/language/template_argument_deduction 有一个示例 (2认同)