对容器中项的恒定正确指针访问
Const-correct pointer access to items in a container
问题
我有一个类,其中包含指向容器的指针。容器提供对其项子集的访问。这是通过具有 const 和非 const 版本返回 const/non-const 指针向量的方法实现的。以下代码摘自更复杂的设置的最小(功能不完全正常):
#include <vector>
struct Entity
{ int dummy; };
template <typename Value>
struct MyContainer
{
typedef Value* pointer;
typedef Value const* const_pointer;
std::vector<pointer> pointers() {
std::vector<pointer> ret;
return ret;
}
std::vector<const_pointer> pointers() const {
std::vector<const_pointer> ret;
return ret;
}
};
struct MyType
{
typedef MyContainer<Entity> ContainerType;
ContainerType* m_data; // I cannot make this a non-pointer attribute
std::vector<Entity*> pointers() {
std::vector<Entity*> ret = m_data->pointers();
return ret;
}
std::vector<Entity const*> pointers() const {
std::vector<Entity const*> ret = m_data->pointers(); // error!
return ret;
}
// std::vector<Entity*> pointers() const {
// std::vector<Entity*> ret = m_data->pointers();
// return ret;
// }
};
int main() {
MyType obj;
MyType const& constobj = obj;
std::vector<Entity*> pointers = obj.pointers();
std::vector<Entity const*> constpointers = constobj.pointers();
// std::vector<Entity*> constpointers = constobj.pointers();
}
Clang 3.8.0(也是 3.5.2)报告错误:
error: no viable conversion from 'vector<pointer>' to 'vector<const Entity *>'
std::vector<Entity const*> ret = m_data->pointers();
^ ~~~~~~~~~~~~~~~~~~
commected代码编译得很好,但是,我的目的是让const访问通过const访问路径(通过constobj
)获得的项目,因此const方法应该返回类型为Entity const*
的指针。将m_data
类型从ContainerType*
更改为ContainerType
可以解决问题,但这在我的原始代码中不是一个选项。
问题:
- 似乎
MyType::pointers() const
通过其属性m_data
调用非常量方法MyContainer::pointers()
,该属性属于MyContainer* const
类型(至少我是这么认为的)。我显然需要类型MyContainer const*
.有没有一个优雅的解决方案来实现这一目标? - 不太优雅的解决方案是将指针投射到 const 指针:
std::vector<Entity const*> ret = static_cast<ContainerType const*>(m_data)->pointers();
这被认为是一个明智的解决方案吗? - 更一般地说:我的设计有缺陷,还是我只是错过了一个细节?
免责声明:我希望这不是重复的,看来其他人以前一定有同样的问题。无论如何,我没有设法通过阅读有关SO的相关问题来解决这个问题。(问题常量正确性导致指针容器出现问题?不同的是,它是关于指针的容器。这个问题似乎是相关的,但答案并没有帮助我解决我目前的问题。
当你写的时候
m_data->pointers()
您正在调用同一函数(非常量函数),因为m_data定义为:
ContainerType* m_data;
也就是说,指向非常量对象的指针。
使用 constobj时,编译器将m_data视为 const 成员(不能更改 constobj),但在此对象中,指针仍指向非 const 对象。
我不知道你的应用程序是什么,但你可以考虑添加一个新函数作为"cpointers"来返回常量指针,即使对象不是常量。
编辑:我的意思是,像这样:
struct MyContainer
{
typedef Value* pointer;
typedef Value const* const_pointer;
std::vector<pointer> pointers() {
std::vector<pointer> ret;
return ret;
}
std::vector<const_pointer> pointers() const {
std::vector<const_pointer> ret;
return ret;
}
std::vector<const_pointer> cpointers() const {
std::vector<const_pointer> ret;
return ret;
}
};
struct MyType
{
typedef MyContainer<Entity> ContainerType;
ContainerType* m_data; // I cannot make this a non-pointer attribute
std::vector<Entity*> pointers() {
std::vector<Entity*> ret = m_data->pointers();
return ret;
}
std::vector<Entity const*> pointers() const {
std::vector<Entity const*> ret = m_data->cpointers(); // error!
return ret;
}
};
更改
std::vector<Entity const*> ret = m_data->pointers(); // error!
自
std::vector<Entity const*> ret =
(static_cast<const MyContainer<Entity>*>(m_data))->pointers(); // OK
相关文章:
- 通过指向指针数组的指针访问子类的属性
- 使用指针访问数组中的对象数据成员
- 无法通过指针访问对象的成员
- decltype:使用指针访问类的静态成员
- 是否可以使用指针访问变量以避免直接编辑变量?
- 为什么 C++ 地址中的矢量无法通过原始指针访问
- 使用指针访问数组元素时出现意外结果
- 使用指针访问数组的值
- C++继承从基类指针访问派生类中的非虚拟函数
- 如何使用指针访问成对向量的元素
- 为什么有些库提供无指针访问,而另一些库则不提供
- 如何通过引用或指针访问二维矢量
- 使用指针访问参数接收的结构中的元素时内存泄漏
- 我正在学习C++,我不能使用指针访问参考吗?(举个例子)
- 复制堆栈上的成员值或使用指针访问它?
- C++娜娜 如何从全局列表框*指针访问列表框内的索引 0 上的按钮?
- 通过此指针访问时的成员差异和自身的成员指针(简单的 QT 示例问题)
- 从指针访问 Kaguya Lua 状态
- 说明通过指针访问非静态类成员函数
- 有没有办法使用初始化到第一行的指针访问 2d 数组的第二行?