只返回传递值的默认函数?

Vin*_*ent 13 c++ lambda templates c++11 std-function

作为一个懒惰的开发人员,我喜欢使用这个技巧来指定一个默认函数:

template <class Type, unsigned int Size, class Function = std::less<Type> >
void arrange(std::array<Type, Size> &x, Function&& f = Function())
{
    std::sort(std::begin(x), std::end(x), f);
}
Run Code Online (Sandbox Code Playgroud)

但是在一个非常特殊的情况下我遇到了一个问题,如下所示:

template <class Type, unsigned int Size, class Function = /*SOMETHING 1*/>
void index(std::array<Type, Size> &x, Function&& f = /*SOMETHING 2*/)
{
    for (unsigned int i = 0; i < Size; ++i) {
        x[i] = f(i);
    }
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我希望默认函数相当于:( [](const unsigned int i){return i;}一个只返回传递值的函数).

为了做到这一点,我需要写什么而不是/*SOMETHING 1*/和/*SOMETHING 2*/?

Man*_*rse 19

没有标准的仿函数可以做到这一点,但写起来很容易(尽管确切的形式是有争议的):

struct identity {
    template<typename U>
    constexpr auto operator()(U&& v) const noexcept
        -> decltype(std::forward<U>(v))
    {
        return std::forward<U>(v);
    }
};
Run Code Online (Sandbox Code Playgroud)

这可以使用如下:

template <class Type, std::size_t Size, class Function = identity>
void index(std::array<Type, Size> &x, Function&& f = Function())
{
    for (unsigned int i = 0; i < Size; ++i) {
        x[i] = f(i);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • +1,而不是`Function()`而不是`identity()`作为默认参数. (3认同)