Discussion:
Library Typedefs are fundamentally broken (alternate implementation)
Andrej Mitrovic via Digitalmars-d
2014-09-23 14:59:25 UTC
Permalink
Guys, all this fighting around. Can't we do something like the
following and sort this out?

-----
import std.string;
import std.typecons;

private struct RealTypedef(T, T init_val, string cookie)
{
/// implementation here...
}

template Typedef(T, T init_val = T.init,
string cookie = "", string mod = __MODULE__, size_t line = __LINE__)
{
static if (cookie == "")
enum the_cookie = format("%s_%s_%s", mod, line, T.stringof);
else
alias the_cookie = cookie;

alias Typedef = .RealTypedef!(T, init_val, the_cookie);
}

alias Type_1 = Typedef!(void*);
alias Type_2 = Typedef!(void*);
static assert(!is(Type_1 == Type_2)); /// safe by default (different types)

alias Same_Type_1 = Typedef!(void*, null, "cookie");
alias Same_Type_2 = Typedef!(void*, null, "cookie");
static assert(is(Same_Type_1 == Same_Type_2)); // unsafe *only if
you request it*

void main ( )
{
}
-----
bearophile via Digitalmars-d
2014-09-23 15:05:28 UTC
Permalink
Post by Andrej Mitrovic via Digitalmars-d
alias Same_Type_1 = Typedef!(void*, null, "cookie");
alias Same_Type_2 = Typedef!(void*, null, "cookie");
static assert(is(Same_Type_1 == Same_Type_2)); // unsafe
*only if you request it*
I suggest to not offer this usage possibility.

Bye,
bearophile
Dicebot via Digitalmars-d
2014-09-23 19:17:49 UTC
Permalink
On Tuesday, 23 September 2014 at 14:59:37 UTC, Andrej Mitrovic
Post by Andrej Mitrovic via Digitalmars-d
Guys, all this fighting around. Can't we do something like the
following and sort this out?
-----
import std.string;
import std.typecons;
private struct RealTypedef(T, T init_val, string cookie)
{
/// implementation here...
}
template Typedef(T, T init_val = T.init,
string cookie = "", string mod = __MODULE__, size_t line =
__LINE__)
{
static if (cookie == "")
enum the_cookie = format("%s_%s_%s", mod, line,
T.stringof);
else
alias the_cookie = cookie;
alias Typedef = .RealTypedef!(T, init_val, the_cookie);
}
alias Type_1 = Typedef!(void*);
alias Type_2 = Typedef!(void*);
static assert(!is(Type_1 == Type_2)); /// safe by default
(different types)
alias Same_Type_1 = Typedef!(void*, null, "cookie");
alias Same_Type_2 = Typedef!(void*, null, "cookie");
static assert(is(Same_Type_1 == Same_Type_2)); // unsafe
*only if
you request it*
void main ( )
{
}
-----
Andrei objects it.
Andrej Mitrovic via Digitalmars-d
2014-09-23 19:52:35 UTC
Permalink
Post by Dicebot via Digitalmars-d
Andrei objects it.
Well I was hoping to get a compromise between the community and the
(benevolent) dictator this way. :)
Andrei Alexandrescu via Digitalmars-d
2014-09-23 20:29:58 UTC
Permalink
Post by Andrej Mitrovic via Digitalmars-d
Post by Dicebot via Digitalmars-d
Andrei objects it.
Well I was hoping to get a compromise between the community and the
(benevolent) dictator this way. :)
I'm as happy as the next guy with changes that move things forward and
handle backwards compatibility graciously. -- Andrei

Loading...