gpt4 book ai didi

c++ - 如何传递 unique_ptrs 的容器,其中容器、ptrs 和对象不可修改?

转载 作者:行者123 更新时间:2023-11-28 04:45:16 25 4
gpt4 key购买 nike

我有一个容器vector,它有某种类型的std::unique_ptr。我想返回那个容器,但也想强制执行我不希望容器、指针或指向的对象是可修改的。我也不想制作此对象的一些平行拷贝。我的别名类型类似于:

using container_t = vector<std::unique_ptr<my_type_t>>

所以我想我可以像这样制作另一个别名:

using const_container_t = const vector<std::unique_ptr<const my_type_t>>

并为我的 setter/getter 做一个reinterpret_cast:

const_container_t& encompassing_type::get_container() const
{
return reinterpret_cast<const_container_t&>(m_container);
}

我认为这应该可行,但我想知道是否有任何我没有看到的问题,或者是否有其他更好的方法。

我还认为这可能会导致最终构建中出现重复的二进制代码,但由于这些代码很可能是内联的,所以这应该不是问题。

最佳答案

“问题”是 std::unique_ptr::operator*被定义为返回一个非常量引用:

std::add_lvalue_reference<T>::type operator*() const

因为它是一个内部类,你可以使用普通指针并显式管理生命周期,允许你做类似的事情

span<my_type_t const> encompassing_type::get_container() const
{
return span( m_container );
}

Justin 建议使用类似 span<const my_type_t> 的东西实现指向 vector 的常量指针 View 。你可以例如使用 Boost.Range 执行此操作并返回一系列 const 指针:

#include <boost/range.hpp>
#include <boost/range/adaptor/transformed.hpp>

using namespace boost::adaptors;

class X {
public:
void nonConst() {}
void constF() const {}
};

class A{
std::vector<std::unique_ptr<X>> v;

public:
A() : v(10) {}
auto get_container() {
return v | transformed( [](std::unique_ptr<X> const& x) -> X const* {return x.get();});
}
};

int main() {
A a;

auto const& v = a.get_container();
a.get_container()[0]->constF();
a.get_container()[0]->nonConst();
return 0;
}

This should be fairly efficient with an optimizing compiler.

您也可以从 std::vector<std::unique_ptr<my_type_t>> 切换至 boost::ptr_vector<my_type_t> .它还假定拥有指针存储的元素的所有权,但它返回 const_reference。在operator[] const这样对象就不能被修改。

#include <boost/ptr_container/ptr_vector.hpp>

class X {
public:
void nonConst() {}
};

class A{
boost::ptr_vector<X> v;

public:
boost::ptr_vector<X> const& get_container() const {
return v;
}
};

int main() {
A a;

auto const& v = a.get_container();
a.get_container()[0].nonConst();
return 0;
}

这将保护元素在 get_container() 时不被修改。返回一个 const 引用:

prog.cc:26:1: error: 'this' argument to member function 'nonConst' has type 'const boost::ptr_container_detail::reversible_ptr_container > >, boost::heap_clone_allocator>::Ty_' (aka 'const X'), but function is not marked const a.get_container()[0].nonConst(); ^~~~~~~~~~~~~~~~~~~~ prog.cc:9:9: note: 'nonConst' declared here void nonConst() {} ^ 1 error generated.

关于c++ - 如何传递 unique_ptrs 的容器,其中容器、ptrs 和对象不可修改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49372302/

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