gpt4 book ai didi

c++ - 在使用不同迭代器的双 for 循环中避免几乎相同的代码重复

转载 作者:太空狗 更新时间:2023-10-29 23:49:20 30 4
gpt4 key购买 nike

我必须根据 我无法更改 的 2 种不同的自定义类型构建图表。
因为它们的签名和用途几乎相同,所以我想删除一些重复代码。
问题是他们返回了一个不同的迭代器。

for (auto itFrom = m_pModelSpace->newIterator(); !itFrom->done() && nodesPassed < maxNodes; itFrom->step(), ++nodesPassed)
{
/*
...
*/
for (auto itTo = m_pModelSpace->newIterator(); itTo->objectId() != itFrom->objectId(); itTo->step())
{
/*
...
*/
}
}

for (auto itFrom = m_pSelectionSet->newIterator(); !itFrom->done() && nodesPassed < maxNodes; itFrom->next(), ++nodesPassed)
{
/*
...
*/
for (auto itTo = m_pSelectionSet->newIterator(); itTo->objectId() != itFrom->objectId(); itTo->next())
{
/*
...
*/
}
}

注释是一模一样的代码。
有什么办法可以解决这个问题吗?
我正在考虑为每种类型使用 2 个构造函数的包装器,但我还需要一个用于对象迭代器的包装器。
另一个想法是对这 2 种类型进行多重继承,但感觉也不对。

有什么建议吗?

总结解决方案
感谢 Mark B,我找到了以下解决方案:

namespace {
OdDbObjectIteratorPtr get_iterator(OdSmartPtr<OdDbBlockTableRecord>& pEntityCollection)
{
return pEntityCollection->newIterator();
}

OdDbSelectionSetIteratorPtr get_iterator(OdSmartPtr<OdSelectionSet>& pEntityCollection)
{
return pEntityCollection->newIterator();
}

void increment_iterator(OdDbObjectIteratorPtr& iter)
{
iter->step();
}
void increment_iterator(OdDbSelectionSetIteratorPtr& iter)
{
iter->next();
}

}

namespace spax{
template <typename Collection>
void ConnectionGraph::ConstructGraph(Collection& pEntityCollection, int maxNodes)
{
// ...
for (auto itFrom = get_iterator(pEntityCollection); !itFrom->done() && nodesPassed < maxNodes; increment_iterator(itFrom), ++nodesPassed)
{
//...
for (auto itTo = get_iterator(pEntityCollection); itTo->objectId() != itFrom->objectId(); increment_iterator(itTo))
{
//...
}
}
}
}

因为选择集返回了 OdDbSelectionSetIteratorPtr 的父 OdSelectionSetIteratorPtr,我添加了另一个受此解决方案启发的函数来获取迭代器。感谢您的帮助,我对结果非常满意。

最佳答案

如何使用具有间接级别的模板函数来处理迭代器增量?

void increment_iterator(<model space iterator type>& iter) { iter->step(); }
void increment_iterator(<selection set iterator type>& iter) { iter->next(); }

template <typename Container>
void execute_nested_loop(Container* c)
{
for (auto itFrom = c->newIterator(); !itFrom->done() && nodesPassed < maxNodes; increment_iterator(itFrom), ++nodesPassed)
{
/*
...
*/
for (auto itTo = c->newIterator(); itTo->objectId() != itFrom->objectId(); increment_iterator(itTo))
{
/*
...
*/
}
}
}

然后调用它:

execute_nested_loop(m_pModelSpace);
execute_nested_loop(m_pSelectionSet);

关于c++ - 在使用不同迭代器的双 for 循环中避免几乎相同的代码重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42812844/

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