On Saturday, 18 January 2014 at 01:52:56 UTC, Rikki Cattermole
wrote:
Okay, I'll explain what I was inferring. If the methods your
calling are lets say nothrow which can be checked by a pure
function lets say. Using the template if statement we can check
that it does throw.
I'm going to continue to think that I am overly not explicit and
thus there continues to be a misunderstanding. However, I'd like
to correct that misunderstanding by saying that *I KNOW HOW TO DO
THIS WITH TEMPLATES AND STATIC IF* :D (By the way, I did sort of
mention it in the first post). In other words, I wasn't asking
*how* to do it in principle, I'm interested if there's any
possibility to do it elegantly.
For example:
void myfunc(T)(T arg) nothrow if (checkIfNothrow!T) {}
void myfunc(T)(T arg) if (checkIfNoModifiers!T) {}
void myfunc(T)(T arg) pure if (checkIfPure!T) {}
Basically you have to define all combinations. That is what I
was meaning.
Preferably you'll use q{} your code that is actually used. And
use a template mixin to generate all these statements, so you
don't have to!
That is precisely the thing I'd like to avoid entirely. Following
your example (which is not entirely correct since in this case I
won't be checking T, I'll be checking T.foo or T.bar or whatever
combination of those :o), I'd have to have three distinct
function definitions, even though in the end only one of them
will ever be compiled into my class. Yes, this can be simplified
by mixing-in the actual function body into all of those
definitions. But we have to be able to do better :)
I'm not trying to say that C++'s syntax wins, no. The syntax can
be anything, other than blowing up my class with all those
declarations and ifs :). If we're talking templates, it would
sure be nice to be just a tad more generic.
Consider:
void myfunc(T)(T arg) pure(isPure!(T.foo))
nothrow(isNoThrow!(T.bar)) { ... }
I know that myfunc *can* be pure (I wrote it) and it *won't*
throw anywhere, and that would be true for all the function body,
*except* I also know that T.foo *may* be impure or T.bar *may*
throw (because I didn't write them, T is an arbitrary type
possibly from user code). Because of those "may"s I either have
to drop the tags entirely, or to have four different declarations
with various combinations of constraints. Having the ability to
specify the condition for a tag would elegantly solve this issue.
It's one definition, no static ifs or additional template
constraints. Again, the syntax here could be anything, like
something proposed in that discussion I mentioned earlier:
void myfunc(T)(T arg) @optional(isPure!(T.foo), pure)
@optional(isNoThrow!(T.bar), nothrow) { ... }
or anything else. Granted, presence of overloads and templates
may make those ifPure/ifNoThrow/ifWhatever checks not that
trivial to implement or invoke, but still possible nevertheless.