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

4ioopgfo  于 2023-01-22  发布在  其他
关注(0)|答案(2)|浏览(107)

假设我有以下函数:

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

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

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

是否有一种方法可以将my_ints传递到sum(),而无需任何额外的分配,例如unique_ptrs的中间向量转换为原始指针的向量?
显然,我可以refacor sum()来获取unique_ptrs的向量,或者重载它,但是我希望找到一种不必这样做的方法,让用户决定是使用unique_ptrs的向量还是原始指针。

omqzjyyz

omqzjyyz1#

不像你想的那样,但是你应该换一种方式来看待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(),它在这里做了你想要的,我会说。

4zcjmb1e

4zcjmb1e2#

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

相关问题