www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Alias vs templates

reply Jean-Louis Leroy <jl leroy.nyc> writes:
I am trying to figure out a crispier syntax for templatized open 
methods. I am stumbling on this (see comments):

// dmd -run conflict.d
int foo();

struct Foo {
   static int foo(int x) { return x; }
}

alias foo = Foo.foo; // overload with an alias - OK

int bar(T)();
int bar(T)(T x) { return x; } // overloaded function templates - 
OK

int baz(T)();

struct Baz {
   static int baz(T)(T x) { return x; }
}

//alias baz = Baz.baz; // Error: alias conflict.baz conflicts 
with template conflict.baz(T)() at conflict.d(11)

void main()
{
   import std.stdio;
   writeln(foo(42)); // 42
   writeln(bar(666)); // 666
}

Why?
Feb 21 2018
parent reply Steven Schveighoffer <schveiguy yahoo.com> writes:
On 2/21/18 1:46 PM, Jean-Louis Leroy wrote:
 I am trying to figure out a crispier syntax for templatized open 
 methods. I am stumbling on this (see comments):
 
 // dmd -run conflict.d
 int foo();
 
 struct Foo {
    static int foo(int x) { return x; }
 }
 
 alias foo = Foo.foo; // overload with an alias - OK
 
 int bar(T)();
 int bar(T)(T x) { return x; } // overloaded function templates - OK
 
 int baz(T)();
 
 struct Baz {
    static int baz(T)(T x) { return x; }
 }
 
 //alias baz = Baz.baz; // Error: alias conflict.baz conflicts with 
 template conflict.baz(T)() at conflict.d(11)
 
 void main()
 {
    import std.stdio;
    writeln(foo(42)); // 42
    writeln(bar(666)); // 666
 }
 
 Why?
I think because one is a function, which is allowed to be overloaded, the other is a symbol. But clearly, there are some liberties taken when you are overloading function templates, as overloading them works just fine. I think this may have been a patch at some point (you didn't use to be able to overload template functions with normal functions). It seems like a reasonable request that this code should work. -Steve
Feb 21 2018
parent Jean-Louis Leroy <jl leroy.nyc> writes:
On Wednesday, 21 February 2018 at 20:27:29 UTC, Steven 
Schveighoffer wrote:
 On 2/21/18 1:46 PM, Jean-Louis Leroy wrote:
 [...]
I think because one is a function, which is allowed to be overloaded, the other is a symbol. But clearly, there are some liberties taken when you are overloading function templates, as overloading them works just fine. I think this may have been a patch at some point (you didn't use to be able to overload template functions with normal functions). It seems like a reasonable request that this code should work.
I just discovered that this works: int baz(T)(); struct Baz { static int baz(T)(T x) { return x; } } alias baz(T) = Baz.baz!T;
Feb 21 2018