tail const
Michel Fortin
michel.fortin at michelf.com
Fri Dec 3 19:17:04 PST 2010
On 2010-12-03 21:25:01 -0500, "Steven Schveighoffer"
<schveiguy at yahoo.com> said:
> On Fri, 03 Dec 2010 21:19:14 -0500, Michel Fortin
> <michel.fortin at michelf.com> wrote:
>
>> On 2010-12-03 21:02:10 -0500, "Steven Schveighoffer"
>> <schveiguy at yahoo.com> said:
>>
>>> On Fri, 03 Dec 2010 20:40:23 -0500, Michel Fortin
>>> <michel.fortin at michelf.com> wrote:
>>>
>>>> I have an idea that would fix those: make a template struct/class
>>>> instance implicitly convertible to another instance of that same
>>>> template if all members share the same memory layout and each member
>>>> is implicitly convertible to the same member of the other template.
>>> I had thought of that too, a long time ago, but I wasn't sure if it
>>> could work. I'd go two steps further:
>>> 1. all the member variable names must be identical.
>>> 2. you need to identify that implicit conversion is allowed.
>>> 1 is for sanity ;)
>>> struct Pair(T)
>>> {
>>> T x;
>>> T y;
>>> }
>>> struct ConstPair(T)
>>> {
>>> const(T) y;
>>> const(T) x;
>>> }
>>> 2 is to ensure you are not able to incorrectly morph data into things
>>> it should not be. i.e.:
>>> struct Point
>>> {
>>> int x;
>>> int y;
>>> }
>>> I don't think you should be able to implicitly cast Pair!int to
>>> Point, sometimes you want to define different APIs for the same data.
>>
>> Just like you, I don't think you should be able to implicitly cast
>> Pair!int to Point.
>>
>> What I was suggesting is that the implicit cast would work only as long
>> as the struct/class instance comes from the same template definition.
>> That'd actually make Pair!int and Pair!uint convertible between each
>> other (because int and uint are implicitly converted from one another)
>> but ConstPair, which originate from a different template definition,
>> wouldn't be convertible from Pair. Instead of defining ConstPair, you'd
>> use Pair!(const(T)) to denote a pair of const elements, and because T
>> is convertible to const(T), Pair!T is also convertible to
>> Pair!(const(T))... as long as the memory layout is preserved, of course.
>
> Oh, I misread your original idea, sorry. I like the idea.
>
> I just think it should be explicit that the 'same memory layout' means
> the names of the variables are the same. I just think of bizarre
> cases where static ifs are used to confuse things.
Yes, by "same memory layout" I mean the same variables, with the same
names, occupying the same bytes.
--
Michel Fortin
michel.fortin at michelf.com
http://michelf.com/
More information about the Digitalmars-d
mailing list