Re: hasMember
 
On Dec 9, 7:01 am, Paavo Helde <myfirstn...@osa.pri.ee> wrote:
Andrea Crotti <andrea.crott...@gmail.com> wrote innews:m11v5rrcno.fsf@ip1-201.halifax.rwth-aachen.de:
Jeff Flinn <TriumphSprint2...@hotmail.com> writes:
To avoid the memory allocation and ownership issues use
boost::optional.
  #include <boost/optional.hpp>
  typedef boost::optional<int> optional_int;
  optional_int Cont::getValue(int idx) const
  {
     std::map<int, int>::const_iterator itr = content.find(idx);
     return (itr != cont.end())? itr->second : optional_int();
  }
and:
  if(optional_int i = obj.getValue(idx)) // safe bool idiom
  {
     int x = *i + 123;                   // deref for value
  }
Using exceptions in this case could be good?
Seems out of place for the use you've described, given what little
info you've provided.
Interesting the optional_int, but I can't use boost...
I'm sure boost::optional is quite easy (and instructive) to implement by
yourself.
Except that he really needs optional<int&>.  Which in turn means
partial specialization for reference types, and the partial
specialization would be nothing more than a wrapper around
a pointer.  There's really no point in not using a pointer to
begin with.
    [...]
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.
If his functions are reasonably small, the increased lexical
scope is not a problem.  Defining an uninitialized int is more
bothersome.
But what's wrong with the pointer solution?  That's what I'd
like to know.  It's certainly the most idiomatic solution for
this problem.
--
James Kanze