digitalmars.D.learn - Q: Help with compile time function
- Myron Alexander (13/42) Jun 23 2007 Hello.
- Jari-Matti =?ISO-8859-1?Q?M=E4kel=E4?= (6/55) Jun 23 2007 I'm afraid that function above doesn't do anything on runtime. You need ...
- Myron Alexander (6/14) Jun 24 2007 Perfect. That is what I want.
Hello. I want to check that a structure contains only the supported types for a fetch from the database. I want to check this at compile time and issue an assert. I have come up with the following:/** * Compile time check that structure field types match supported types for * structure fetch. * * Supported types :- * int (int32), long (int64), char[] (utf-8), void[] (blob), float, double. * * Unsupported types :- * wchar[] (utf-16) * void* (null) * * It does not make sense to support null as a value return type so it will * never be supported. The utf16 type is not supported at this time as I do * not know how to support it. Only partial support for utf16 in the system. */ static void chkStrucOkForFetch(T) () { foreach (i, f; FieldTypeTuple!(T)) { static assert ( is (typeof(f) == int) || // int32 is (typeof(f) == long) || // int64 is (typeof(f) == char[]) || // utf-8 is (typeof(f) == void[]) || // blob is (typeof(f) == float) || is (typeof(f) == double) , "Invalid field type for structure fetch. Field ("~str(i)~ ") not one of int, long, char[], void[], float, double." ); } }This code performs the check but I cannot get it to print the name of the structure and the field. Please can you help me with the following: - How can I get the name of the structure (T) and field type at compile time? - If I call this from a normal run-time function, will it get executed at run-time as well as in compile-time? Thanks and best regards, Myron.
Jun 23 2007
Myron Alexander wrote:Hello. I want to check that a structure contains only the supported types for a fetch from the database. I want to check this at compile time and issue an assert. I have come up with the following:You mean T.stringof and f.stringof ?/** * Compile time check that structure field types match supported types for * structure fetch. * * Supported types :- * int (int32), long (int64), char[] (utf-8), void[] (blob), float, double. * * Unsupported types :- * wchar[] (utf-16) * void* (null) * * It does not make sense to support null as a value return type so it will * never be supported. The utf16 type is not supported at this time as I do * not know how to support it. Only partial support for utf16 in the system. */ static void chkStrucOkForFetch(T) () { foreach (i, f; FieldTypeTuple!(T)) { static assert ( is (typeof(f) == int) || // int32 is (typeof(f) == long) || // int64 is (typeof(f) == char[]) || // utf-8 is (typeof(f) == void[]) || // blob is (typeof(f) == float) || is (typeof(f) == double) , "Invalid field type for structure fetch. Field ("~str(i)~ ") not one of int, long, char[], void[], float, double." ); } }This code performs the check but I cannot get it to print the name of the structure and the field. Please can you help me with the following: - How can I get the name of the structure (T) and field type at compile time?- If I call this from a normal run-time function, will it get executed at run-time as well as in compile-time?I'm afraid that function above doesn't do anything on runtime. You need to use the RTTI system to get the type at runtime.Thanks and best regards, Myron.--
Jun 23 2007
Jari-Matti Mäkelä wrote:You mean T.stringof and f.stringof ?Exactly what I need.Perfect. That is what I want. Thanks, you have helped alot. Regards, Myron.- If I call this from a normal run-time function, will it get executed at run-time as well as in compile-time?I'm afraid that function above doesn't do anything on runtime. You need to use the RTTI system to get the type at runtime.
Jun 24 2007