Thanks you both answered my question, although I had to convince myself compiling Kevin's simple case so I was not day dreaming.
I guess what I had in mind was along:
map<string, MyObject *> mymap;
if ( (auto obj = mymap.find(key) ) == mymap.end() ) {
// deal with it
} else {
obj.do_work()
}
I rarely use that form, and I don't remember whether 'obj' is still
declared in the 'else' block or not, so I would actually write (if it
were possible):
if ((auto obj = mymap.find(key) != mymap.end())
{
obj.do_work();
}
else
{
// deal with it
}
The more common idiom *I* use involves a pointer:
if (SomeType* pBlah = getThePointerSomehow())
{
// use the non-null pBlah
}
else
{
// even if 'pBlah' is still declared here, it's null,
// so no reason to involve that name
}
which should explain why I don't care to learn whether 'pBlah' would be
still declared in the 'else' part
Now, with your 'find/end' stuff, the only way I see to combine the
declaration/definition/initialization is to declare your own wrapper for
the "find" operation:
template<class C> struct find_wrapper {
C& co;
typename C::iterator it;
template<class W> find_wrapper(C& c, const W& w)
: co(c), it(c.find(w)) {}
// here is the key thing that allows declaring it in an 'if'
operator bool() const { return it != co.end(); }
typename C::iterator::value_type& obj() { return *it; }
void operator =(const find_wrapper&) {}
};
template<class C, class W>
find_wrapper<C> do_find(C& co, const W& w) {
return find_wrapper<C>(co, w);
}
#include <map>
int main()
{
std::map<int,double> mymap;
int key = 666;
mymap.find(key);
if (auto finder = do_find(mymap, key))
{
// use finder.obj() somehow:
std:
air<int,double> id = finder.obj();
}
else
{
// deal with it
}
}
Feel free to modify it.
Victor