xxxxxxxxxx
import std.stdio;
struct Foo
{
int data;
Foo opBinary(string op)(int rhs)
{
static if (op == "+") return Foo(data + rhs);
else static assert(0, "Operator "~op~" not implemented");
}
int opCast()
{
return data;
}
}
template canCast(castFrom, castTo)
{
static if (is(T : castTo) || __traits(compiles, cast(castTo) castFrom.init))
{
enum canCast = true;
}
else
{
enum canCast = false;
}
}
T bar(T)(T x)
if (canCast!(T, int))
{
return x + 1;
}
void main()
{
Foo x = Foo(1);
writeln(bar(x));
}