Re: ReturnType and overloaded functions

2015-06-13 Thread ketmar via Digitalmars-d
On Fri, 12 Jun 2015 17:28:56 -0700, Ali Çehreli wrote:

 void main()
 {
   static assert(is (ReturnType!(() = foo(long.init)) == int));
   static assert(is (ReturnType!(() = foo(byte.init)) == short));
 }

 Ali

 or without importing `std.traits`:

static assert(is(typeof(foo(long.init)) == int)); static
assert(is(typeof(foo(byte.init)) == short));


 Good point. :) What is the difference of ReturnType then?

i don't know. it looks nicer, maybe. ;-)

signature.asc
Description: PGP signature


Re: ReturnType and overloaded functions

2015-06-13 Thread Yuxuan Shui via Digitalmars-d

On Saturday, 13 June 2015 at 05:14:00 UTC, Kenji Hara wrote:

2015-06-13 9:29 GMT+09:00 Idan Arye via Digitalmars-d 
digitalmars-d@puremagic.com:


On Friday, 12 June 2015 at 23:26:00 UTC, Yuxuan Shui wrote:

When there are multiple overloaded functions, whose return 
type will I
get when I use ReturnType? Is there a way I could choose a 
specific

function by its parameter types?



The return type of the first declared one:
http://dpaste.dzfl.pl/f448ec624592



That's definitely a bug in current dmd. ReturnType should make 
error when

overloaded function symbol is given.

To pick up one of the overloaded functions, you can use
__traits(getOverloads).

Kenji Hara


It's kind of pointless to pick any one of the overloads. It would 
be convenient if a template exists to help us pick a overload by 
matching its parameter type.


That being said, the solution given earlier in this thread seems 
to work, I just wonder if there're any caveats.


Re: ReturnType and overloaded functions

2015-06-13 Thread Artur Skawina via Digitalmars-d
On 06/13/15 01:25, Yuxuan Shui via Digitalmars-d wrote:
 When there are multiple overloaded functions, whose return type will I get 
 when I use ReturnType? Is there a way I could choose a specific function by 
 its parameter types?

   alias ReturnType(alias F, A...) = typeof(F(A.init));


artur


Re: ReturnType and overloaded functions

2015-06-12 Thread Ali Çehreli via Digitalmars-d

On 06/12/2015 06:44 PM, Freddy wrote:

 Why not just use templates?

The question is about overloaded functions.

Ali



Re: ReturnType and overloaded functions

2015-06-12 Thread Kenji Hara via Digitalmars-d
2015-06-13 9:29 GMT+09:00 Idan Arye via Digitalmars-d 
digitalmars-d@puremagic.com:

 On Friday, 12 June 2015 at 23:26:00 UTC, Yuxuan Shui wrote:

 When there are multiple overloaded functions, whose return type will I
 get when I use ReturnType? Is there a way I could choose a specific
 function by its parameter types?


 The return type of the first declared one:
 http://dpaste.dzfl.pl/f448ec624592


That's definitely a bug in current dmd. ReturnType should make error when
overloaded function symbol is given.

To pick up one of the overloaded functions, you can use
__traits(getOverloads).

Kenji Hara


ReturnType and overloaded functions

2015-06-12 Thread Yuxuan Shui via Digitalmars-d
When there are multiple overloaded functions, whose return type 
will I get when I use ReturnType? Is there a way I could choose a 
specific function by its parameter types?


Re: ReturnType and overloaded functions

2015-06-12 Thread Ali Çehreli via Digitalmars-d

On 06/12/2015 04:25 PM, Yuxuan Shui wrote:

When there are multiple overloaded functions, whose return type will I
get when I use ReturnType? Is there a way I could choose a specific
function by its parameter types?


I am curious about the answer myself but there is the workaround of 
passing the overload through a lambda:


import std.traits;

int foo(long)
{
return 0;
}

short foo(byte)
{
return 0;
}

void main()
{
static assert(is (ReturnType!(() = foo(long.init)) == int));
static assert(is (ReturnType!(() = foo(byte.init)) == short));
}

Ali



Re: ReturnType and overloaded functions

2015-06-12 Thread ketmar via Digitalmars-d
On Fri, 12 Jun 2015 16:32:37 -0700, Ali Çehreli wrote:

 On 06/12/2015 04:25 PM, Yuxuan Shui wrote:
 When there are multiple overloaded functions, whose return type will I
 get when I use ReturnType? Is there a way I could choose a specific
 function by its parameter types?
 
 I am curious about the answer myself but there is the workaround of
 passing the overload through a lambda:
 
 import std.traits;
 
 int foo(long)
 {
  return 0;
 }
 
 short foo(byte)
 {
  return 0;
 }
 
 void main()
 {
  static assert(is (ReturnType!(() = foo(long.init)) == int));
  static assert(is (ReturnType!(() = foo(byte.init)) == short));
 }
 
 Ali

or without importing `std.traits`:

  static assert(is(typeof(foo(long.init)) == int));
  static assert(is(typeof(foo(byte.init)) == short));


signature.asc
Description: PGP signature


Re: ReturnType and overloaded functions

2015-06-12 Thread Ali Çehreli via Digitalmars-d

On 06/12/2015 05:04 PM, ketmar wrote:

On Fri, 12 Jun 2015 16:32:37 -0700, Ali Çehreli wrote:


On 06/12/2015 04:25 PM, Yuxuan Shui wrote:

When there are multiple overloaded functions, whose return type will I
get when I use ReturnType? Is there a way I could choose a specific
function by its parameter types?


I am curious about the answer myself but there is the workaround of
passing the overload through a lambda:

import std.traits;

int foo(long)
{
  return 0;
}

short foo(byte)
{
  return 0;
}

void main()
{
  static assert(is (ReturnType!(() = foo(long.init)) == int));
  static assert(is (ReturnType!(() = foo(byte.init)) == short));
}

Ali


or without importing `std.traits`:

   static assert(is(typeof(foo(long.init)) == int));
   static assert(is(typeof(foo(byte.init)) == short));



Good point. :) What is the difference of ReturnType then?

Ali



Re: ReturnType and overloaded functions

2015-06-12 Thread Idan Arye via Digitalmars-d

On Friday, 12 June 2015 at 23:26:00 UTC, Yuxuan Shui wrote:
When there are multiple overloaded functions, whose return type 
will I get when I use ReturnType? Is there a way I could choose 
a specific function by its parameter types?


The return type of the first declared one: 
http://dpaste.dzfl.pl/f448ec624592


Re: ReturnType and overloaded functions

2015-06-12 Thread Freddy via Digitalmars-d
I am curious about the answer myself but there is the 
workaround of passing the overload through a lambda:


import std.traits;

int foo(long)
{
return 0;
}

short foo(byte)
{
return 0;
}

void main()
{
static assert(is (ReturnType!(() = foo(long.init)) == 
int));
static assert(is (ReturnType!(() = foo(byte.init)) == 
short));

}

Ali


Why not just use templates?

int foo(size_t id)() if(id == 0){
return 0;
}

short foo(size_t id)() if(id == 1){
return 0;
}

static assert(is(typeof(foo!0()) == int));
static assert(is(typeof(foo!1()) == short));