digitalmars.D.learn - static if (__ctfe)
- Yuriy (2/2) May 07 2014 Hello, is there any way to static if(__ctfe)? I want to declare
- John Colvin (3/5) May 07 2014 Sadly not as far as I know. What's the use-case? There may be a
- Yuriy (7/12) May 07 2014 Well, i'm currently playing with std.variant so it can be
- Timon Gehr (26/39) May 08 2014 I'd suggest to just look into making typeid's comparable in CTFE.
Hello, is there any way to static if(__ctfe)? I want to declare class members which are only available in ctfe. Thanx.
May 07 2014
On Wednesday, 7 May 2014 at 09:47:20 UTC, Yuriy wrote:Hello, is there any way to static if(__ctfe)? I want to declare class members which are only available in ctfe. Thanx.Sadly not as far as I know. What's the use-case? There may be a nice solution none-the-less.
May 07 2014
On Wednesday, 7 May 2014 at 09:51:01 UTC, John Colvin wrote:On Wednesday, 7 May 2014 at 09:47:20 UTC, Yuriy wrote:Well, i'm currently playing with std.variant so it can be ctfe-friendly. And it works pretty much, however i need to use T.stringof.ptr/length instead of typeid (typeid is ctfeable), and i'm not sure if it's good for performance in runtime. So for type comparison i'd like to compare TypeInfos in rt, and T.stringof in ct. Using both with rt if will likely generate more code.Hello, is there any way to static if(__ctfe)? I want to declare class members which are only available in ctfe. Thanx.Sadly not as far as I know. What's the use-case? There may be a nice solution none-the-less.
May 07 2014
On 05/07/2014 12:07 PM, Yuriy wrote:On Wednesday, 7 May 2014 at 09:51:01 UTC, John Colvin wrote:I'd suggest to just look into making typeid's comparable in CTFE. I have grepped around DMD's source code a little bit, but I am not familiar with it. (And I don't want to get involved in DMD development, because the code base is horrid.) If you add in ctfeexpr.c/isCtfeComparable the conjunct 'x->op != TOKsymoff' (which probably is a very blunt way of enabling typeid comparisons and should be done more precisely), then you will notice that comparisons now work but always return 'false' for some types. I have attempted a fix for this for classes as follows in typinf.c: TypeInfoDeclaration *TypeClass::getTypeInfoDeclaration(){ if(!sym->vclassinfo){ if (sym->isInterfaceDeclaration()) return TypeInfoInterfaceDeclaration::create(this); // still buggy! else{ sym->vclassinfo = TypeInfoClassDeclaration::create(this); } } return sym->vclassinfo; } I.e. the problem is that the frontend always creates new TypeInfoDeclarations instead of reusing a single existing one. After this, typeid comparisons appear to work correctly for classes at least. You might look into getting this fixed completely for all types (or at least file a bug containing the above information.)On Wednesday, 7 May 2014 at 09:47:20 UTC, Yuriy wrote:Well, i'm currently playing with std.variant so it can be ctfe-friendly. And it works pretty much, however i need to use T.stringof.ptr/length instead of typeid (typeid is ctfeable), and i'm not sure if it's good for performance in runtime. So for type comparison i'd like to compare TypeInfos in rt, and T.stringof in ct. Using both with rt if will likely generate more code.Hello, is there any way to static if(__ctfe)? I want to declare class members which are only available in ctfe. Thanx.Sadly not as far as I know. What's the use-case? There may be a nice solution none-the-less.
May 08 2014