Re: C++ Frequently Questioned Answers
Jerry Coffin wrote:
In article <4738825A.1070806@erdani.org>,
SeeWebsiteForEmail@erdani.org
says...
[ ... ]
There's plenty of things that can be done, and lex/yacc are only the
beginning:
I have no argument with that -- I just pointed to them as the "most
obvious" examples, not (by any means) the only ones.
* Perl's black hole and white hole classes
(http://cpan.uwinnipeg.ca/htdocs/Class-WhiteHole/Class/WhiteHole.html
http://cpan.uwinnipeg.ca/htdocs/Class-BlackHole/Class/
BlackHole.html).
It's late, so maybe I'm just tired and easily confused. While these
have
obvious applicability in dynamically typed languages, I'm not sure how
you apply them in a statically-typed language like C++.
For any others looking on: with a dynamically typed language, you
don't
specify the type of an object, so the compiler can't tell whether the
object will really implement the method you use. C++, however, is
statically typed, so the compiler always knows what type an object is,
and if you try to call a method that doesn't exist in that type, the
code doesn't compile.
Of course, you can work around that with something like a
reinterpret_cast. Most of us would just say: "don't do that", but if
you
want more, tagged types would seem like the obvious way to go. With
them
in place, either of the behaviors above becomes trivial.
This is a confusion. Black and white holes are useful in statically-
typed languages.
Consider:
struct Employee
{
virtual string name() = 0;
virtual string ssn() = 0;
};
Then BlackHole<Employee> generates:
struct BlackHole<Employee> : Employee
{
virtual string name() { return string(); }
virtual string ssn() { return string(); }
}
And WhiteHole<Employee> generates:
struct WhiteHole<Employee> : Employee
{
virtual string name() { throw runtime_error(typeid(*this).name() +
string(" does not implement name()"); }
virtual string ssn() { throw runtime_error(typeid(*this).name() +
string(" does not implement ssn()"); }
}
Andrei
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]