Hi all,
I have ~15y of C++ and now I want to test D, because it seems
really intersting and "cleaner" than C++.
As an exercice I m trying to implement something equivalent to
the C++ std::integral_constant<T,T value> in D.
In D:
struct IntegralConstant(T, T VALUE) {
...
}
But I do not know how to write a compile-time type check. I tried
template isIntegralConstant(ANY)
{
enum bool
isIntegralConstant=__traits(identifier,ANY)=="IntegralConstant";
}
But when using it with ANY=long type, I get a compile-time error:
"argument long has no identifier"
A workaround that worked is:
struct IntegralConstantTag {}
struct IntegralConstant(T, T VALUE) {
private IntegralConstantTag selfTag_;
alias selfTag_ this;
}
template isIntegralConstant(ANY)
{
enum bool isIntegralConstant=is(ANY : IntegralConstantTag);
}
But now I'm sticked by a compiler issue when I want to introduce
2 "alias this" to allow implicit conversion:
struct IntegralConstant(T, T VALUE) {
private IntegralConstantTag selfTag_;
alias selfTag_ this;
T value_=VALUE;
alias value_ this;
}
Compiler error message is "integralConstant.d:16:3: error: there
can be only one alias this".
I would be very graceful for any help/advice that explains the
right way to implement C++ std::integral_constant<T,T value> in
the D language.
Vincent