Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C++ How do I pass a list of non-consts to a function wanting a list of consts

I have a function with a signature

void Foo(list<const A*>)

and I want to pass it a

list<A*>

How do I do this? (plz note - the list isn't constant, only the member of the list)

like image 953
vondip Avatar asked Jan 24 '11 20:01

vondip


1 Answers

The problem you have is that even though T * can be implicitly converted to a T const *, the template system isn't "aware" of that, so a whatever<T *> and whatever<T const *> are completely unrelated types, and there's no implicit conversion from one to the other.

To avoid the problem, I'd probably avoid passing a collection at all. Instead I'd have the function take a pair of iterators. A list<A *>::iterator can be implicitly converted to a list<A *>::const_iterator. For that matter, I'd probably make the function a template, so it can take iterators of arbitrary type.

This is likely to save you quite a bit of trouble -- a list is only rarely a good choice of container, so there's a very large chance that someday you'll want to change from list<A *> to vector<A *> or perhaps deque<A *> -- and if you make your function generic, you'll be able to do that without rewriting the function at all.

like image 184
Jerry Coffin Avatar answered Oct 23 '22 05:10

Jerry Coffin