Thread overview
TypeTuple of functions
Jan 26, 2012
bearophile
Jan 26, 2012
H. S. Teoh
Jan 27, 2012
Daniel Murphy
January 26, 2012
I'm asking questions all the time :-)

I have just closed this bug report as fixed: http://d.puremagic.com/issues/show_bug.cgi?id=5695

Using that idiom I've seen a difference:


template TypeTuple(TList...) {
    alias TList TypeTuple;
}

double f1(in double x) pure nothrow { return x; }
alias TypeTuple!(f1) funcs1;

alias TypeTuple!(function(in double x) pure nothrow { return x; }) funcs2;

void main() {
    pragma(msg, typeid(typeof(funcs1[0])).stringof); // &D18TypeInfo_FNaNbxdZd6__initZ
    pragma(msg, typeid(typeof(funcs2[0])).stringof); // &D22TypeInfo_PFNaNbNfxdZxd6__initZ
}


Do you know what's the difference between those two functions? (I am not able to read mangled names).

Bye and thank you,
bearophile
January 26, 2012
On Thu, Jan 26, 2012 at 01:32:35PM -0500, bearophile wrote: [...]
> template TypeTuple(TList...) {
>     alias TList TypeTuple;
> }
> 
> double f1(in double x) pure nothrow { return x; }
> alias TypeTuple!(f1) funcs1;
> 
> alias TypeTuple!(function(in double x) pure nothrow { return x; }) funcs2;
> 
> void main() {
>     pragma(msg, typeid(typeof(funcs1[0])).stringof); // &D18TypeInfo_FNaNbxdZd6__initZ
>     pragma(msg, typeid(typeof(funcs2[0])).stringof); // &D22TypeInfo_PFNaNbNfxdZxd6__initZ
> }
> 
> 
> Do you know what's the difference between those two functions? (I am not able to read mangled names).
[...]

You could just use:

	writeln(typeid(typeof(...)));

instead; it gives you readable names. I modified your code and ran it, and got:

	double()
	const(double)()*


T

-- 
Computers are like a jungle: they have monitor lizards, rams, mice, c-moss, binary trees... and bugs.
January 27, 2012
Differing part:
 FNaNb  xdZ d6
PFNaNbNfxdZxd6

P -> pointer
Nf -> @safe
x -> const

The second one is a function pointer not a function, is inferred to be @safe, and inferred to return const(double).


"bearophile" <bearophileHUGS@lycos.com> wrote in message news:jfs683$2mqh$1@digitalmars.com...
> I'm asking questions all the time :-)
>
> I have just closed this bug report as fixed: http://d.puremagic.com/issues/show_bug.cgi?id=5695
>
> Using that idiom I've seen a difference:
>
>
> template TypeTuple(TList...) {
>    alias TList TypeTuple;
> }
>
> double f1(in double x) pure nothrow { return x; }
> alias TypeTuple!(f1) funcs1;
>
> alias TypeTuple!(function(in double x) pure nothrow { return x; }) funcs2;
>
> void main() {
>    pragma(msg, typeid(typeof(funcs1[0])).stringof); //
> &D18TypeInfo_FNaNbxdZd6__initZ
>    pragma(msg, typeid(typeof(funcs2[0])).stringof); //
> &D22TypeInfo_PFNaNbNfxdZxd6__initZ
> }
>
>
> Do you know what's the difference between those two functions? (I am not able to read mangled names).
>
> Bye and thank you,
> bearophile