Hey D people.
Currently in my project I have worked on a unified type interface for all arrays which requires fixed-size arrays to be stored as pointer (in correspondence to dynamic and associative arrays) and allow them being allocated with any selected allocator.
There can be code like this:
enum isPointedStaticArray(T) = (is(T : P*, P) && .isStaticArray!P);
//...
static if (.isPointedStaticArray!T)
{
// ...
}
It won't compile when the argument of isPointedStaticArray()
is NO pointer.
The compiler complains, about P
being undefined.
What is the best workaround for this?
It's crazy. I can reverse the problem that it only fails if the argument IS a pointer:
enum isPointedStaticArray(T) =
(){
enum condition = `is(`~T.stringof~` : P*, P) && .isStaticArray!P`;
static if (__traits(compiles, mixin(condition)) )
return mixin(condition); // "P already defined" error
else
return false;
}();
Types defined in __traits(compiles, ...)
are emitted to the outside?!
Okay, this is my current workaround:
enum isPointedStaticArray(T) =
(){
static if (is(T : P*, P))
return .isStaticArray!(P);
else
return false;
}();
// ...
static if (isPointedStaticArray!T)
{
}
for outlining an expression is(...) && ...
Is there a simpler way in D to do this? If there only would be a &&&
short circuit operator which doesn't compile the right side if the left side wouldn't compile to true.
Did someone already had the idea of a static-try-catch
which catches compilation errors?