On Fri, Jan 17, 2014 at 07:08:54PM +0000, Tobias Pankrath wrote:
> >I can store properties of type A, B and C but when i retrieve them
> >they all come back as A because of array covariance. I wonder if
> >there is a way of casting them automagically to the correct type.
> 
> So you basically want to declare a classmember for every name
> opDispatch is called with? That is not possible;
> 
> I thought about declaring it static in opDispatch itself, but than
> you can only have one instance. Next thought: Declare a static
> hashmap and store the values there, but then you could just use
> std.variant.

One of the reasons this breaks down is because of situations like this:

        class MyClass {
                ...
                auto opDispatch(string op)() {
                        return ... /* assume we magically return the right type 
here */;
                }
        }

        // Which of these assignments to 'abc' should determine its
        // type? What if the function that gets called is determined at
        // runtime only? What if they are in two separately-compiled
        // modules?

        void fun(MyClass o) {
                o.abc = 123;
        }

        void gun(MyClass o) {
                o.abc = "xyz";
        }

        auto x = o.abc; // what's the type of x?

Another problematic case:

        auto o = new MyClass;
        auto p = new MyClass;

        o.abc = 123;
        p.abc = "xyz";

        // Problem: now the return type of opDispatch cannot be
        // determined at compile-time.

Now, if you decide beforehand that "abc" is always an int, and "def" is
always a string, then this problem is avoided:

        o.abc = 123; // OK
        p.abc = 123; // OK
        o.abc = "xyz"; // compile error
        p.abc = "xyz"; // compile error
        o.def = "xyz"; // OK
        p.def = "xyz"; // OK
        o.def = 123; // compile error
        p.def = 123; // compile error


T

-- 
Freedom of speech: the whole world has no right *not* to hear my spouting off!

Reply via email to