
From: Matthew Vogt <mattvogt@warpmail.net>
Rob Stewart wrote:
I guess it looks okay with c.value(). What do you think?
I don't like it.
I don't like it either, but it does have the benefit of simplifying the code by removing all the explicit good() tests. I think explicit testing for good status is something that's going to be very easy to forget, while you're trying to write 'simple' filters that are implemented in get functions which can (effectively) be called asynchronously.
Your code had implicit goodness tests. They, too, can be forgotten, but I understand your point is that this: if (c = get(src)) isn't checking whether c is a non-zero character, but whether it is a good character.
That's the right approach: just code in terms of good(c). You get simplified code without the oddity of asking a basic_character for its character. The real value in the suggestion is that one should ignore fail() and eof() conditions in the filter. That's something you can document and your examples can show the simplified form.
But the 'simplified' form will have (c = get(src) && c.good()) everywhere, and the abstraction of algorithm state will result in more convoluted boolean expressions where testing 'good' will be very easy to omit...
I was thinking of "good(c = get(src))" which isn't convoluted.
You'd be relying on the conversion as a substitute for good, no?
Syntactic sugar is nice when it isn't too sweet.
Well, if it helps correctness, it isn't really sugar.
One thing to remember is that a filter is write once, use many times (modulo bug fixes). Once it works, it works. The syntactic sugar you're suggesting applies in only a few expressions in such a filter, so it isn't much of a win, is it? Let's review. There are several things one needs to do with a basic_character: - return it from a function - test it to determine success - compare it to a char/wchar_t Have I missed anything? Given those requirements the class needs: - value semantics - safe-bool conversion - comparisons with char/wchar_t Therefore, I think this will work: template <typename Ch> class basic_character { public: basic_character(Ch const); Ch value() const; operator unspecified-bool-type() const; bool operator ==(Ch const) const; bool operator !=(Ch const) const; bool operator >(Ch const) const; bool operator >=(Ch const) const; bool operator <(Ch const) const; bool operator <=(Ch const) const; friend bool good(basic_character const); friend bool fail(basic_character const); friend bool eof(basic_character const); friend bool would_block(basic_character const); private: Ch ch_; }; Now you can write both of these: if (c = get(src)) if (c == comment_char_) -- Rob Stewart stewart@sig.com Software Engineer http://www.sig.com Susquehanna International Group, LLP using std::disclaimer;