如何防止从非常量访问指针中过滤指针向量的函数?
Posted
技术标签:
【中文标题】如何防止从非常量访问指针中过滤指针向量的函数?【英文标题】:How to prevent a function which filters vector of pointers from non-const-accessing pointees? 【发布时间】:2015-12-19 13:32:18 【问题描述】:我有一个函数,它过滤指针向量,返回过滤后的版本。根据其参数的性质,类型为const vector<Data*>&
,它可以更改指针指向的Data
结构。有什么办法让它无法通过指针更改Data
,同时仍然能够返回其参数的过滤版本vector<Data*>
?
【问题讨论】:
您可以使用一些指针包装器,当取消引用并成为const
时,它将返回 const&
给指针对象。原始指针和智能指针返回可变引用
你会在你的代码中允许什么来实现这一点?不能直接做。
@black 函数参数可以修改,函数源也可以。即使来电者也可以。它只是需要或多或少地简单(并且可扩展)。
【参考方案1】:
你有一个一元函数:
(const vector<Data*>&)
您不能在向量内强制转换指针的常量,但您可以更改函数的参数类型。我建议这样做:
(const Data* const*, size_t)
然后,这样称呼它:
filter(vec.data(), vec.size());
现在您的函数正在接受指向const Data
的指针,因此无法更改它们。调用者不需要做任何特别的事情。如果你想保持旧的调用风格,你可以做一个包装器:
filter(const vector<Data*>& vec)
return filter(vec.data(), vec.size());
至于返回类型,可以用const_cast
:
vector<Data*> filter(const Data* const* data, size_t size)
vector<Data*> results;
for (size_t ii = 0; ii < size; ++ii)
results.push_back(const_cast<Data*>(data[ii]));
return results;
这些都不能提供“完美”的安全性,但是,const
永远不会!
【讨论】:
vec.data()
将是Data**
,不是吗? (或 Data * const *
,用于 const 限定的 vec
)。
@T.C.:谢谢,我解决了这个问题。我现在实际上已经在我的答案中编译了代码。 :)以上是关于如何防止从非常量访问指针中过滤指针向量的函数?的主要内容,如果未能解决你的问题,请参考以下文章