将(Qt)对象容器转换为const对象的容器有效吗?

ecl*_*kso 5 c++ qt

我的具体问题是我有一个QMultiHash<Foo,Bar*> private成员,我想提供对哈希值的访问,但是对于const项目的版本,声明:

QList<const Bar*> getBars(Foo f) const;
Run Code Online (Sandbox Code Playgroud)

是否有一个更清洁/更有效的方法来"补充" Qt容器的项目,而不是使用const项目和从源代码复制指针(QMultiHash<K,V>::values()在这种情况下)创建一个新容器的丑陋/低效?

我担心答案可能是"不",但我想确保我没有错过一些Qt/C++(03)语法魔法来做到这一点.

Res*_*ion 0

有两种方法。您提到的明显方法是使用 C++11 并自行将其转换为QList<const Bar*>.

QList<const Bar*> getList() const
{
    QList<const Bar*> list;

    for(Bar *b : m_List) //where m_List is your private memebr QList<Bar*>
        list << b;

    return list;
}
Run Code Online (Sandbox Code Playgroud)

另一种方法是将QList自身转换为const QList<Bar*>可以通过从 const 函数返回列表来“神奇地”完成的方法,例如:

const QList<Bar*> getList() const
{ 
    return m_List; //where m_List is your private memebr QList<Bar*>
} 
Run Code Online (Sandbox Code Playgroud)

使用哪一种取决于您的需要。根据您的描述,您需要检查元素而不更改它们。听起来您实际上根本不需要可修改列表。第一个变体听起来已经有点矫枉过正了。您之所以需要,const Bar*大概是因为您不希望它在检查项目时意外更改。例如,要检查所有元素,您可以执行以下操作(为每个元素自动添加 const):

for(const Bar *b : myObject->getList())
    //do only const stuff with b
Run Code Online (Sandbox Code Playgroud)

除非您有充分的理由返回,QList<const Bar*>例如您需要可以修改列表,否则不值得为此带来麻烦和性能损失。当您以我描述的方式Bar *使用 C++11 或使用 const 迭代器自行访问它时,可以使用 const 进行限制。for根据我收集的信息,我建议使用它,而不是将(可能很大)列表的值转换为 const。

最后一个提示,如果您的列表确实很大并且您需要每一点性能下降,请考虑:

const QList<Bar*> &getList() const
Run Code Online (Sandbox Code Playgroud)

我相信 Qt 的隐式共享在前面的代码片段中自行完成了此操作,但这确保了在检查列表时永远不会复制或修改列表。