C++如何将非consts列表传递给想要一个consts列表的函数

von*_*dip 12 c++ const covariance

我有一个带签名的功能

void Foo(list<const A*>)
Run Code Online (Sandbox Code Playgroud)

我想通过它

list<A*>
Run Code Online (Sandbox Code Playgroud)

我该怎么做呢?(注意 - 列表不是常量,只是列表的成员)

Jer*_*fin 19

你遇到的问题是即使T *可以隐式转换为a T const *,模板系统也不会"意识到"它,所以a whatever<T *>whatever<T const *>完全不相关的类型,并且没有从一个到另一个的隐式转换.

为了避免这个问题,我可能会避免传递一个集合.相反,我有这个函数需要一对迭代器.A list<A *>::iterator 可以隐式转换为a list<A *>::const_iterator.就此而言,我可能会将该函数作为模板,因此可以使用任意类型的迭代器.

这可能是为您节省了不少麻烦-一个list几乎只是容器的一个很好的选择,所以有一个非常大的机会,有一天你会想从更改list<A *>vector<A *>或可能deque<A *>-如果你让你的函数通用,你将能够在不重写功能的情况下做到这一点.

  • 关于使用迭代器的好建议.但是,`list <A*> :: iterator`和`list <A const*> :: iterator`(或`const_iterator`)之间没有关系,所以带迭代器的函数必须将它们作为模板参数. (7认同)