gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 01:08:41 26 4
gpt4 key购买 nike

假设我有这个函数:(它几乎对容器中的每个值运行一个函数,然后返回每次迭代结果的 vector )

#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,为了实现它,我将不得不创建两个 vmap 获取非 const V 和一个 const

当有多个容器/vector 传递给一个函数时开始感觉太多了,因为它让我写2^containers_count 函数。

是否有任何(肮脏但有效的)解决方案?

最佳答案

您可以使用转发引用绑定(bind)到普通左值引用(例如 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;
}

Demo

请注意,如果您要传递一个 const 容器(谢谢,Miles),您传递的 lambda 必须适用于两个 const,所以 p++这是不可能的(尽管要注意一个模板实例化修改输入而另一个不修改输入,这可能是意外的):

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);

关于c++ - 如何在不复制函数的情况下推导 const 和非常量类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41683159/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com