On Saturday, 17 October 2015 at 15:31:00 UTC, Nikolay wrote:
I asked on SO question about opDispatch and compile time parameters: http://stackoverflow.com/questions/32998781/opdispatch-and-compile-time-parameters
[...]
Is it good idea for opDispatch improvement or may there is some other approach?

I must have my answer not too long after you made this thread, but there is another approach:
(copied from SO)

You need to use the eponymous template pattern, and have an opDispatch function with your compile-time parameters inside an outer opDispatch template that takes the regular opDispatch string parameter. You can also have multiple inner opDispatch functions (and fields) that follow regular overload rules.


    import std.stdio;

    struct Foo {

        public template opDispatch(string name) {

            public string opDispatch() {
                return name;
            }

            public T opDispatch(T)() {
               return T.init;
            }

            public string opDispatch(T)(string s) {
                return name ~ ' ' ~ T.stringof ~ ' ' ~ s;
            }
        }
    }

    void main()
    {
        Foo foo;
        writeln( foo.bar );
        writeln( foo.baz!int );
        writeln( foo.foo!Foo("foo") );
    }

Produces the output:

    bar
    0
    foo Foo foo

DPaste link: http://dpaste.dzfl.pl/6e5cfca8b702


I haven't fully explored the limitations of this approach, but it does work for simple cases.

Reply via email to