繁体   English   中英

我可以传递一个 std::vector 吗<std::unique_ptr<t> > 作为一个没有额外分配的原始指针向量? </std::unique_ptr<t>

[英]Can I pass a std::vector<std::unique_ptr<T>> as a vector of raw pointer without extra allocations?

假设我有以下 function:

void sum(const std::vector<int*>& input) {
  return ... ; // the sum
}

我在某处存储了一个 int 指针向量

...
std::vector<std::unique_ptr<int>> my_ints;

有没有办法将my_ints传递给sum()而无需任何额外分配,例如将 unique_ptrs 的中间向量转换为原始指针向量?

显然,我可以重构sum()来取一个唯一 ptrs 的向量。 或者超载。 但我希望找到一种我不必这样做的方法,让用户决定是否使用 unique_ptrs 向量或原始指针。

不像你想要的那样,但你应该以不同的方式考虑sum() 它看起来像一个在范围内运行的算法,所以你应该让它更像这样:

template <typename It>
ValueType sum(It begin, It end) {
    // ... iterate and calculate sum
    return sum;
}

然后突然之间,您可以开始使用范围来做很酷的事情了!

std::vector<std::unique_ptr<int>> my_ints;
auto range = my_ints | ranges::views::transform
(
    [](auto smart_ptr) {
        return smart_ptr.get();
    }
);

这是一个会随着您的使用而变化的范围! 然后你可以像这样将它输入到你的sum()中:

auto my_sum = sum(std::begin(range), std::end(range));

还要查找std::accumulate() ,我会说,它在这里做你想要的。

不,绝对没有办法在不更改方法的情况下将这些指针值传递给该sum方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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