From: Maciej Sobczak <no.spam@no.spam.com>
Subject: Re: Type safety, C++ and code generation
Date: Thu, 27 Apr 2006 17:16:45 +0200
Date: 2006-04-27T17:16:45+02:00 [thread overview]
Message-ID: <e2qn8t$n13$1@sunnews.cern.ch> (raw)
In-Reply-To: <1146148380.102042.119860@y43g2000cwc.googlegroups.com>
REH wrote:
>>>>http://www.msobczak.com/prog/typegen/
>>
>>>You maybe interested in a C++ class that I wrote.
>>
>>Been there, done that:
>>
>>http://www.msobczak.com/prog/downloads.html
>>
>>(see safetypes.tar.gz and range.tar.gz)
>
>
> I don't see where you've "done that."
The template class that implements range checking?
>>I have dropped this idea because I think that the external code
>>generator is much more flexible and more powerful with regard to the
>>type safety that can be gained. Range checking is just one little part
>>of what is needed. Template classes are fine if you can afford limiting
>>yourself only to this little part, but that's not usually the case.
>
> I never said it was the end-all-be-all, just thought you may be
> interested. I don't know what you think templates are limiting you to.
It's not about templates themselves, but rather about the whole approach.
What about making different types really distinct?
typedef ranged_type<int, 0, 100> R1;
typedef ranged_type<int, 0, 100> R2;
typedef ranged_type<int, 0, 101> R3;
Above, R1 and R2 are *equal* to the compiler, but R3 is distinct from
the other two. This is or can be problematic in those contexts where you
would rather expect them all to be different from each other -
especially when you think in terms of different *domains*, no matter
what is their range of values.
Another problem is that the range, as a set of values, is not the only
thing that constitues a type - you also need to define the set of legal
operations. The problem is that I usually want them to be different in
each type.
Consider this:
type ranged_type<int, 0, 250> Speed;
Speed s1, s2, s3; // with some values
s1 = s2 + s3; // OK
s1 = s2 * s3; // not OK
The addition is fine, but the multiplication should not be provided,
because speed multiplied by speed is not a speed. Can you extend your
class so that the compiler will refuse to compile the second operation
above?
(Ada, anyone? :) )
Another problem is variation of the behaviour in the out-of-range
condition. What should happen then? Throw an exception? That's only one
of at least four different options I can imagine, and also not the one I
would choose most of the time. Does your class allow variations here?
(Ada, anyone? :) )
And so on - all this *can* be done with templates, but at some point
this approach just saturates and the code becomes a nightmare. Not
mentioning the error messages that you get from the compiler (and the
whole purpose of this is to actually get *useful* error messages,
right?). And not mentioning the compilation time.
These are exactly the factors that limit the practical useability of the
template approach and that's why I claim that external code generator
can be much more powerful.
--
Maciej Sobczak : http://www.msobczak.com/
Programming : http://www.msobczak.com/prog/
next prev parent reply other threads:[~2006-04-27 15:16 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-04-27 10:35 Type safety, C++ and code generation Maciej Sobczak
2006-04-27 13:19 ` REH
2006-04-27 14:08 ` Maciej Sobczak
2006-04-27 14:33 ` REH
2006-04-27 15:16 ` Maciej Sobczak [this message]
2006-04-27 15:39 ` Georg Bauhaus
2006-04-28 5:57 ` Maciej Sobczak
2006-04-28 12:16 ` Georg Bauhaus
2006-04-28 12:37 ` brian.b.mcguinness
2006-04-28 17:04 ` Georg Bauhaus
2006-04-28 18:50 ` Jeffrey R. Carter
2006-04-28 19:07 ` Randy Brukardt
2006-04-28 19:46 ` Robert A Duff
2006-04-28 19:55 ` Dmitry A. Kazakov
2006-04-29 21:28 ` Florian Weimer
2006-04-27 16:05 ` REH
2006-04-28 6:17 ` Maciej Sobczak
2006-04-30 14:40 ` adaworks
2006-04-30 15:23 ` REH
2006-04-30 18:14 ` Martin Krischik
2006-05-02 6:27 ` Maciej Sobczak
2006-05-02 13:33 ` REH
2006-05-02 15:05 ` Maciej Sobczak
2006-05-02 15:54 ` REH
2006-05-02 16:50 ` Martin Krischik
2006-05-02 19:50 ` REH
2006-04-27 14:47 ` REH
2006-04-27 15:10 ` REH
2006-04-28 6:22 ` Maciej Sobczak
replies disabled
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox