gpt4 book ai didi

c++ - 将 shared_ptr 的 vector 转换为 shared_ptr 的 vector 到 const

转载 作者:可可西里 更新时间:2023-11-01 18:27:51 28 4
gpt4 key购买 nike

class A
{
std::vector<std::shared_ptr<int>> v_;
};

现在我想添加对 v_ 的访问权限使用两个公共(public)成员函数

std::vector<std::shared_ptr<int>> const & v() { return v_; }

std::vector<std::shared_ptr<int const> const & v() const { TODO }

我无法替换 TODOreturn v_;虽然。

一个选项是不返回引用,而是返回拷贝。除了明显的性能损失外,这还会使界面变得不那么令人满意。

另一种选择是制作TODO等于 return reinterpret_cast<std::vector<std::shared_ptr<int const>> const &>(v_);

我的问题是,这是未定义的行为吗?或者,有没有更好的选择,最好不要使用 reinterpret_cast

最佳答案

避免复制容器的一种方法是提供转换迭代器,在取消引用时转换元素:

#include <vector>
#include <memory>
#include <boost/iterator/transform_iterator.hpp>

class A
{
std::vector<std::shared_ptr<int> > v_;

struct Transform
{
template<class T>
std::shared_ptr<T const> operator()(std::shared_ptr<T> const& p) const {
return p;
}
};

public:

A() : v_{std::make_shared<int>(1), std::make_shared<int>(2)} {}

using Iterator = boost::transform_iterator<Transform, std::vector<std::shared_ptr<int> >::const_iterator>;

Iterator begin() const { return Iterator{v_.begin()}; }
Iterator end() const { return Iterator{v_.end()}; }

};

int main() {
A a;
// Range access.
for(auto const& x : a)
std::cout << *x << '\n';
// Indexed access.
auto iterator_to_second_element = a.begin() + 1;
std::cout << **iterator_to_second_element << '\n';
}

关于c++ - 将 shared_ptr 的 vector 转换为 shared_ptr 的 vector 到 const,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48641861/

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