Idea to verify virtual/final methods
Adam D. Ruppe
destructionator at gmail.com
Tue Jun 4 06:46:31 PDT 2013
On Tuesday, 4 June 2013 at 13:15:39 UTC, bearophile wrote:
> An idea:
bearophile, you're a genius. I've been trying to think of a way
to do this for the last week or so and you've got it.
usage:
struct small(T) if(T.sizeof < 9) {}
@CustomCheck!small
class RTTest {}
object.d additions:
enum CustomCtCheckResult {
fail, pass
}
template CustomCheck(alias C) {
template CustomCheck(T) {
static if(__traits(compiles, C!T))
enum CustomCheck =
CustomCtCheckResult.pass;
else
enum CustomCheck =
CustomCtCheckResult.fail;
}
}
bool doCustomChecks(T)() {
if(__ctfe) {
foreach(attr; __traits(getAttributes, T)) {
static if(is(typeof(attr!T) ==
CustomCtCheckResult)) {
static assert(attr!T ==
CustomCtCheckResult.pass);
}
}
return true;
}
}
template RTInfo(T) {
/* other rtinfo stuff can remain */
enum customChecksPassed = doCustomChecks!T;
}
If we updated this to go right through the members too, we'd be
really cooking.
object.d(755): Error: static assert (cast(CustomCtCheckResult)0
== cast(CustomCtCheckResult)1) is false
object.d(774): instantiated from here:
doCustomChecks!(RTTest)
minimal.d(168): instantiated from here: RTInfo!(RTTest)
the last line helps find it. For members it will be trickier but
there the CustomCheck template could take __FILE__ and __LINE__
as default arguments and just print them instead of static assert
0.
More information about the Digitalmars-d
mailing list