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

标签 c++

我必须根据 我无法更改 的 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/

相关文章:

c++ - 在切换循环周期结束时未显示的游戏总数

c++ - pimpl 和.cpp 文件中定义类的区别

c++ - 如果没有 if-constexpr 成功,触发编译时错误的最佳方法?

c++ - pjsip 新调用错误...无法找到默认音频设备 (PJMEDIA_EAUD_NODEFDEV)

c++ - 如何安全地删除 ATL DLL 中的 std::thread

c++ - 为什么阻塞技术减少分支指令?

c++ - 比较 2 个 LBP (OpenCV C++)

c++ - 为什么 OpenSSL 在 Windows 上无法正确链接

c++ - MinGW,g++,winapi,winsdk,迷茫中

c++ - 右移开头为零