Re: hasMember
Anyway I didn't specify much because is a general (for me) problem,
every time I have a class which has some structure (set/vector/map) I
might want to check and get some values from it.
This might reflect a deeper design problem. A class is meant for
encapsulating some bunch of data together with functions operating on
this data. From your description it sounds like trying to tear this
encapsulation apart.
Yes sure, in theory I perfectly agree.
But in my case I have a main actor which has to take the decisions and
(most of) the other classes are actually data containers.
I encapsulate everything I can and expose only the minimum, but I often
need to get values from there.
In my opinion getting something only if hasMember is true was also a way
to encapsulate, the only drawback is sometimes performance.
Exceptions are meant more for propagating errors multiple layers up the
call stack. If the not-found event is common and expected, then it is not
"exceptional" and should not be expressed as an exception. Besides, the
exception mechanism may easily be much slower than searching the
container twice (which was your original worry).
Ok I see, well in other languages is a more common pattern, maybe not
with dict/lists, but in python trying to get something is quite common.
And I don't think it could not be used in C++, otherwise why
std::vector::at uses exactly this mechanism?
Have you considered the simple way of having another output parameter in
addition to the return value?
bool Cont::getValue(int idx, int& value_out) const
{
std::map<int, int>::const_iterator itr = content.find(idx);
if (itr != content.end()) {
value_out = itr->second;
return true;
} else {
return false;
}
}
// ...
int x;
if (obj.getValue(idx, x)) {
// x found and valid, do something with x
}
This has the drawback that the lexical scope of x is too broad, but if
this is a very low-level class used only by a couple of slightly higher-
level classes this might be OK.
hth
Paavo
That also works thanks...
Well at the moment I'll leave everything like this until I'm not sure
about another solution, optional_int would be the cleanest probably.