gpt4 book ai didi

c++ - 在 C++ 中给出指针常量 View 的更好方法

转载 作者:行者123 更新时间:2023-12-05 09:01:43 27 4
gpt4 key购买 nike

我有一个类,它必须返回一些指向软件上层的指针的常量 View 。

在内部,指针必须是非常量,因为类需要在内部操作对象。

我没有看到任何选项可以在不复制所有指针的情况下向更高级别的客户端提供指针的常量 View 。这似乎很浪费。如果我要管理数百万个对象怎么办?

有没有更好的办法?

下面是一些示例代码:

#include <vector>
#include <iostream>

class example {
public:

example() {
bytePtrs_.push_back(new char);
*bytePtrs_[0] = '$';
}

// I want to do this, but compiler will not allow
// error: could not convert ‘((example*)this)->example::bytePtrs_’ from ‘std::vector<char*>’ to ‘std::vector<const char*>’
std::vector<const char*> getPtrs() {
return bytePtrs_;
}

// Must make wasteful copy
std::vector<const char*> getPtrs() {
std::vector<const char*> ret;
for (auto &ptr : bytePtrs_)
ret.push_back(ptr);
return ret;
}

private:

std::vector<char*> bytePtrs_;
};

int main() {

example e;

std::vector<const char*> bytePtrs = e.getPtrs();

std::cout << bytePtrs[0] << std::endl;

}

最佳答案

您可以使用 std::experimental::propagate_const 执行此操作.

这会将指针的常量转发到指向的对象上。

#include <experimental/propagate_const>

class example {
public:

// using vector = std::vector<char*>>;
using vector = std::vector<std::experimental::propagate_const<char*>>;

example() {
bytePtrs.push_back(new char);
*bytePtrs[0] = '$';
}

vector const& getPtrs() const {
return bytePtrs;
}

private:

vector bytePtrs;
};

int main()
{
example e;

example::vector const& bytePtrs = e.getPtrs();

// dereference this or add a null terminator
std::cout << *bytePtrs[0] << std::endl; // fine and dandy

*bytePtrs[0] = 'x'; // compile error
}

关于c++ - 在 C++ 中给出指针常量 View 的更好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72916809/

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