繁体   English   中英

如何在不复制函数的情况下推导const和非const类型?

[英]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);

由于参数化vectorconst ,要使其实现,我将必须创建两个获取非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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM