Re: an algorithm with interruption in the middle
James Kanze wrote:
Actually, I would reject anything which didn't allow the use of
the switch.
A good point.
(Maybe we should be able to write "break for;" or "break while;"
to break out of a loop in a switch construct. :D)
Or you could do something like this:
int key;
while ((key = pop()) != NONE) { /* ... */ }
which prevents you from "initialization at declaration"
and leaves key in scope after the loop, though..
Big deal. Unless the function is excessively complicated, there
won't be any significant code after the loop anyway. More
bothersome is the fact that it requires declaring the key
without an initializer.
Yes it is, but I (or we) have learned to live with it. The declaration
and the first assignment is very close to each other, anyway, so the
chances of confusion is minimal.
Moreover, it's so common an idiom in reading an input of an unspecified
length:
string name;
while (cin >> name) { /* ... */ }
that I don't see it as a big problem. (Of course you can get around this
by writing something like:
template <typename T>
struct retval
{
bool success;
T value;
operator bool() const { return success; }
};
template <typename T>
retval<T> read(std::istream& is)
{
retval<T> r;
r.success = is >> r.value;
return r;
}
while (retval<string> name = read<string>(cin)) {
/* use name.value */
}
but I wouldn't go that far.)
If NONE has a value which converts implicitly to false, you can
simply write:
while ( int key = pop() ) {
switch ( key ) {
// ...
}
}
And be done with it. I'm not sure I like this too much either,
though. Burying a declaration in a control flow statement is
fine for obfuscation, but in this case, doesn't seem to buy you
anything else.
Not only for obfuscation; I would say it's the cleanest solution in this
case, and in many others, including I/O. The main restriction is that
the declared variable can be compared only to zero, so see my proposal
in another posting.. :)
--
Seungbeom Kim
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]