【发布时间】:2019-11-15 05:12:07
【问题描述】:
这是来自一些重构代码的模板。 drPin 和 drPort 都是 drNode 的子类。此代码从原始包含的指针中去除 const 限定,并基于它构建两个新数据结构(新数据结构需要指向映射中的非常量的指针,因为使用它们的代码并非都是正确的 const -受限制的)。现在,第一个参数是const std::vector<const drPin*> 或const std::vector<drPort*>。为了让第二个匹配,我目前正在将其复制到const drPort* 的向量中,然后调用:std::vector<const drPort*> constPorts(aPorts.cbegin(), aPorts.cend());
template <typename T>
static void buildFlatNetNodes(const std::vector<const T*>& aPins,
std::map<drNet*, std::list<drNode*>> &flatNetNodes,
std::vector<drNet *> &netOrder)
{
for (const T* constPin : aPins)
{
T *curPin = const_cast<T *>(constPin);
drNet* curFlatNet = curPin->getNet();
auto ii = flatNetNodes.find(curFlatNet);
if (ii == flatNetNodes.end())
{
flatNetNodes[curFlatNet] = std::list<drNode *>{curPin};
netOrder.push_back(curFlatNet);
}
else
ii->second.push_back(curPin);
}
}
现在我想在std::list<drNode*> 上使用相同的模板。我可以使用相同的复制技巧来获得std::vector<const drNode*>,但是这个列表将比端口向量长得多,因此额外的复制开销会相应更大,我想避免它。尝试使容器类型通用(通过添加另一层模板并将第一个类型声明为const S<const T*>)在使用std::list<const drNode*> 调用时编译失败。使用开始/结束迭代器而不是通过引用传递容器可能会起作用 - 还有其他建议吗?有没有办法将foo* 的容器传递给期望const foo* 的容器的代码? (我似乎记得有一个不起作用的原因,但我目前似乎没有正确的搜索词组合来找到它)。
【问题讨论】:
标签: c++ pointers vector c++14 constants