Going from CTFE-land to Template-land
Denis Koroskin
2korden at gmail.com
Tue Nov 17 07:09:55 PST 2009
On Tue, 17 Nov 2009 18:07:03 +0300, Don <nospam at nospam.com> wrote:
> Bill Baxter wrote:
>> Currently this doesn't work, because the CTFE function doesn't "know"
>> that it's running compile-time:
>> int templ_incr(int x)() {
>> return x+1;
>> }
>> int ctfe_incr(int x) {
>> return templ_incr!(x);
>> }
>> Seems common to write a function that you know is only intended to be
>> used compile-time.
>> But it can't compile because the compiler doesn't know you only plan
>> to call it at compile-time.
>> Is something version(__ctfe) might help with? E.g.
>> version(__ctfe) {
>> // only allow cfte_incr to be called at compile-time so it can use
>> templates
>> int ctfe_incr(int x) {
>> return templ_incr!(x);
>> }
>> }
>
> No. Here's the only functionality you'll get. This works by exploiting
> bug 1330. It's inefficient: the inCTFE function gets called all the
> time. Should just be a bool value, which will be constant-folded away.
> Otherwise, it's the same as this:
>
> // true if evaluated in CTFE, false if called at runtime.
> bool inCTFE()
> {
> int [1] x = [1];
> int [] y = x;
> y[0] = 2;
> return x[0]!=2;
> }
>
> static assert(inCTFE());
>
> void main()
> {
> assert(!inCTFE());
> }
Haha, nice one!
More information about the Digitalmars-d
mailing list