gpt4 book ai didi

c++ - 将对以 shared_ptr 为值的映射的引用转换为对以 shared_ptr 为常量值的映射的引用

转载 作者:行者123 更新时间:2023-11-27 23:39:34 26 4
gpt4 key购买 nike

假设我们有一个类,成员如下 std::map<unsigned int, std::shared_ptr<ObscureType>> member_我们无法替换 member通过具有 std::shared_ptr<const ObscureType> 的 map ,因为该类必须对 ObscureType 的非常量函数进行操作.

类现在应该有一个函数 const std::map<unsigned int, std::shared_ptr<const ObscureType>& getUnderlyingMap() const .其他类可能将此类作为依赖项,并且必须对 ObscureType 的 const 函数进行操作.

我们不能简单地写 return member_getUnderlyingMap() ,因为这种隐式转换是不允许的。

因为 static_castconst_cast不工作,我去了reinterpret_cast .

因此方法体是

const std::map<unsigned int, std::shared_ptr<const ObscureType>& getUnderlyingMap() const {
return reinterpret_cast<const std::map<unsigned int, std::shared_ptr<const ObscureType>&>(member_);
}

正在使用 reinterpret_cast在这种情况下安全吗?

有没有更好的方法来解决这个问题?请注意,不使用 shared_ptr不是一个选项,因为对象的创建方式(Node-V8 集成)

最佳答案

不,那根本不安全。

我能想到的两个选项:不公开 map ,而是公开您需要的功能(不易出错,但也不太干净,并且您不能使用需要 as std::map 的接口(interface)):

std::shared_ptr<const ObscureType> getInUnderlyingMap(unsigned int index) const {
return member_.at(index); // Might want to return nullptr instead of throwing
}
std::size_t sizeOfUnderlyingMap() const noexcept {
return member_.size();
}
// etc.

或者你可以让你的member_一个std::map<unsigned int, std::shared_ptr<const ObscureType>> ,通过 getUnderlyingMap 中的 const 引用返回它,并在内部使用 std::const_pointer_cast在没有 const 的情况下使用它(确保你正在分配非常量指针,所以 const_pointer_cast 不是 UB):

private:
std::map<unsigned int, std::shared_ptr<const ObscureType>> member_;

std::shared_ptr<ObscureType> obscure_object(const std::shared_ptr<const ObscureType>& p) noexcept {
return std::const_pointer_cast<ObscureType>(p);
}
std::shared_ptr<ObscureType> obscure_object(std::shared_ptr<const ObscureType>&& p) noexcept {
return std::const_pointer_cast<ObscureType>(std::move(p));
}

void internal_method() {
obscure_object(member_[0]).non_const_method();
}

public:
const std::map<unsigned int, std::shared_ptr<const ObscureType>& getUnderlyingMap() const {
return member_;
}

关于c++ - 将对以 shared_ptr 为值的映射的引用转换为对以 shared_ptr 为常量值的映射的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56416303/

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