[英]How to deduce const and non-const type without duplicating functions?
假设我有这个函数:(几乎对容器中的每个值运行一个函数,然后返回每次迭代结果的向量)
#include <vector>
using std::vector;
template<class F, class V>
auto vmap(const F &f, const V &v) -> vector<decltype(f(v[0]))> {
vector<decltype(f(v[0]))> result;
result.reserve(v.size());
for (auto &p : v)
result.push_back(f(p));
return result;
}
我不能这样称呼它:
vector<int> vint = {1,2,3,4,5};
vmap([](auto &p) {return p++;},vint);
由于参数化vector
是const
,要使其实现,我将必须创建两个获取非const
V
vmap
和一个const
。
当有多个容器/ vector
传递给一个函数时,它会感觉太多,因为它使我编写了2^containers_count
函数。
是否有任何(肮脏但可行的)解决方案?
您可以使用转发引用来绑定到普通的左值引用(例如std::vector<int>&
)和右值引用( std::vector<int>&&
)。
缺点是您永远无法传递值(仅ref,const ref或r-value ref),尽管我认为这对您没有问题:
template<class F, class V>
auto vmap(F&& f, V&& v) {
vector<decltype(f(v[0]))> result;
result.reserve(v.size());
for (auto& p : v)
result.push_back(f(p));
return result;
}
请注意,如果要传递const容器,则传递的lambda必须对两个const都适用(谢谢,Miles),因此p++
问题(尽管请注意,一个模板实例化会修改输入,而另一个模板实例化会修改输入) t,这可能是意外的):
vector<int> vint = {1,2,3,4,5};
vmap([](auto &p) {return p++;},vint);
const std::vector<int> vint2 = vint;
vmap([](auto &p) {return p+1;},vint2);
如果要允许您的函数修改向量,则从函数的参数中删除const
。 v
的常数将根据为其提供的参数推导。
您也不需要指定返回类型,它将从return
语句中推导出来。
template<class F, class V>
auto vmap(const F &f, V &v) {
vector<decltype(f(v[0]))> result;
result.reserve(v.size());
for (auto&p : v)
result.push_back(f(p));
return result;
}
注意result.reserve(v.size());
仅适用于std::vector
。 如果要泛化算法,则需要删除该行或对其进行专门化。
您可以使用带有常数向量的lambda。 例如:
vmap([](const auto &p) {return p+1;}, vint);
或修改vmap
,它不需要常数向量。 例如:
auto vmap(const F &f, V &v)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.