C ++ lambda或基于lambda基于签名的重载解析中的可选/忽略参数

问题描述

我有一个这样的迭代助手:

template <typename T,typename Op>
void for_each(T* a,size_t n,Op op) {
    for (size_t i = 0; i < n; i++) {
        a[i] = op(a[i],i);
    }
}

我希望它可以在有或没有i的{​​{1}}参数的情况下使用:

op

是否可以使用C ++ 14或更早版本来做到这一点?

注意:我没有选择使用// float* a; for_each(a,n,[](const float& v) { return v + 1; }); for_each(a,[](const float& v,const size_t& i) { return v + i; }); 来忽略第二个参数,也没有选择将(const float& v,size_t) { }签名更改为op或类似名称

解决方法

使用SFINAE,您可以这样做

template <typename T,typename Op>
auto for_each(T* a,size_t n,Op op) -> decltype(op(a[n],n),void()){
    for (size_t i = 0; i < n; i++) {
        a[i] = op(a[i],i);
    }
}
template <typename T,Op op) -> decltype(op(a[n]),void()){
    for (size_t i = 0; i < n; i++) {
        a[i] = op(a[i]);
    }
}