byval keyword to make objects act as value types
BC
NOTmi_emayl_adrez at hotmail.com.remove.not
Sat Dec 22 21:09:43 PST 2007
On Sun, 23 Dec 2007 04:01:30 -0000, Christopher Wright
<dhasenan at gmail.com> wrote:
> BC wrote:
>> so that 'byval MyClass' is a new type that acts like MyClass in all
>> ways (ie. is polymorphic) except that it gets dupped on non-const
>> assignment from other byval MyClasses and normal MyClasses. possibly
>> also on assignment to normal MyClasses. this would require that it
>> *has* a dup method, or maybe a copy constructor
>
> Perhaps this would be better as a class declaration modifier?
>
> byval class Foo {} // acts like a struct
>
> Or:
> valueclass Foo {}
>
> It would be simpler, at least: an opAssign overload.
>
true, it's just that I don't buy that classes are always either value or
reference types, I think flexibility is desirable. you could still do
class Foo{}
alias byval Foo VFoo;
>> byval Base b = new Derived;
>> despite the name 'byval' b actually holds a reference to a copy of
>> Derived, so slicing is avoided.
>> or, if that's too inefficient perhaps the linker can figure out the
>> size of the largest class derived from Base and allocate that much on
>> the stack/inside a containing class.
>
> If we get this, I'm going to ask for virtual template methods in classes
> again. It's not happening.
>
no, i'm not holding my breath. it could for final classes though.
>> myFunction(ref Base arg)
>> {
>> ++arg;
>> }
>> myFunction(b)
>> i'm thinking it should be overridable so that the above function
>> *does* change the value of b
>
> Besides which, arg isn't assigned to...
>
> void func(ref ValueClass arg) {
> arg = new ValueClass();
> }
>
>> question: are calls to final class member functions non-virtual?
>
> Well, yes. But do you mean, are they found in the vtbl? You could check:
> class Foo {
> final void a(){}
> final void b(){}
> final void c(){}
> }
>
> assert (Foo.classinfo.vtbl.length == Object.classinfo.vtbl.length);
>
i should have said 'member functions of final classes'. both are found
in the vtbl. i was wondering how close to struct behaviour we can bring
classes.
>> i notice the tango iterators are classes. surely we want to use
>> iterators as value types... this way, we can.
>> alternatively, since scope objects are a bit like value types already,
>> perhaps we can just add the functionality to that.
>
> Ugh. No.
>
no? currently the spec says you can't assign to them (although i see now
that you can), so i thought that might be the plan.
>> then, we just need to return refs from functions, and it's goodbye C++!
More information about the Digitalmars-d
mailing list