On Monday, 24 September 2012 at 07:51:23 UTC, Jonathan M Davis
wrote:
On Monday, September 24, 2012 09:41:26 monarch_dodra wrote:
Regarding the ".init" issue, I hadn't thought of that, but it
can
be worked around pretty easily with an is(R r):
--------
template Hello(R)
if ( is(R r) &&
is(typeof(takeExactly(r, 1))) &&
is(R == typeof(takeExactly(r, 1)))
)
{
alias R Hello;
}
--------
That was one trick that I was not aware of. I didn't think that
one is
expression could have an effect on a later one in the
surrounding expression.
Cool. Though I would point out that that probably doesn't avoid
the init
problem, because R r uses R.init (unless is expressions treat
it differently,
which they may). The normal way to avoid that is to do
R r = void;
but I don't think that that would work in that is expression.
Sometimes
disabling init is useful, but it can definitely be problematic.
It may
ultimately have been a mistake to allow it. I don't know.
- Jonathan M Davis
Well, it does work...
struct S
{
@disable this();
}
void foo(T)(T i)
if ( is(T t))
{}
void main()
{
//S s; //Fail
S s = void;
foo(s); //Works
}
I think it makes sense that it works, because "is" doesn't
actually validate a compile time syntax, rather it is just
declaring that "t can be used as an instance of T", but it is not
actually declaring *the variable* "t" itself... Not sure I'm
explaining myself.
Or I think that's how it works. I've been on a wrong streak
lately :/