问题描述
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]);
}
}