加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 刚刚返回传递值的默认函数?

发布时间:2020-12-16 03:12:46 所属栏目:百科 来源:网络整理
导读:作为一个懒惰的开发者,我喜欢使用这个技巧来指定一个默认的功能: template class Type,unsigned int Size,class Function = std::lessType void arrange(std::arrayType,Size x,Function f = Function()){ std::sort(std::begin(x),std::end(x),f);} 但是在
作为一个懒惰的开发者,我喜欢使用这个技巧来指定一个默认的功能:
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);
}

但是在一个非常特殊的情况下我有一个问题,这是以下几点:

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

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

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

解决方法

没有标准的函子做到这一点,但它很容易写(尽管确切的形式是为了一些争议):
struct identity {
    template<typename U>
    constexpr auto operator()(U&& v) const noexcept
        -> decltype(std::forward<U>(v))
    {
        return std::forward<U>(v);
    }
};

这可以使用如下:

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读