digitalmars.D.learn - IFTI with constant args, is this already possible?
- Chad J (23/23) Jan 30 2007 So suppose I have a function template, one that is supposed to be
- Don Clugston (9/19) Jan 30 2007 There's no syntax sugar for this at present. (Though I've proposed it,
- Chad J (2/28) Jan 31 2007 Ah. Thanks for the info.
- Don Clugston (15/44) Feb 01 2007 BTW, my proposal was for something like:
So suppose I have a function template, one that is supposed to be instantiated via IFTI. Then, the user supplies an argument that is constant (ex: foo(42,"cat")). Is there any way that I can grab those constant arguments at compile time and use them to do compile time computation? Even better, can I do it in variadic templates? I'm envisioning a situation like this: // the string-to-integer conversion is done at compile time bignum bigAssInteger = "3420894398526094609987620490236001914309690234"; ... struct bignum { ulong[] data; ... void opAssign(char[] value)() { data = toBigInt!(value); } } or something like that. BigNums come to mind as a simple example, but I've run into this sort of thing other times too. Hard to put it down since I don't know if it's even possible, much less what it would look like.
Jan 30 2007
Chad J wrote:So suppose I have a function template, one that is supposed to be instantiated via IFTI. Then, the user supplies an argument that is constant (ex: foo(42,"cat")). Is there any way that I can grab those constant arguments at compile time and use them to do compile time computation? Even better, can I do it in variadic templates? I'm envisioning a situation like this: // the string-to-integer conversion is done at compile time bignum bigAssInteger = "3420894398526094609987620490236001914309690234";There's no syntax sugar for this at present. (Though I've proposed it, and there are indications that it will happen). But: bigAssInteger = toBigInt!("3420894398526094609987620490236001914309690234"); is currently possible. Until we get early discard of templates, it's not really a good idea right now because compilation is slow while the compiler generates an enormous obj file full of junk.
Jan 30 2007
Don Clugston wrote:Chad J wrote:Ah. Thanks for the info.So suppose I have a function template, one that is supposed to be instantiated via IFTI. Then, the user supplies an argument that is constant (ex: foo(42,"cat")). Is there any way that I can grab those constant arguments at compile time and use them to do compile time computation? Even better, can I do it in variadic templates? I'm envisioning a situation like this: // the string-to-integer conversion is done at compile time bignum bigAssInteger = "3420894398526094609987620490236001914309690234";There's no syntax sugar for this at present. (Though I've proposed it, and there are indications that it will happen). But: bigAssInteger = toBigInt!("3420894398526094609987620490236001914309690234"); is currently possible. Until we get early discard of templates, it's not really a good idea right now because compilation is slow while the compiler generates an enormous obj file full of junk.
Jan 31 2007
Chad J wrote:Don Clugston wrote:BTW, my proposal was for something like: BigInt opAssign(super T : char [])(T s){ static if (is(s == const)) { // compile-time assign setFromLiteral!(s); } else { // runtime-assign. ... } } Requires (1) super in a template parameter list distinguishes between storage classes. (2) is( A B == const) --> if A is a literal, sets B to be that literal. Andrei's storageof() proposal could probably achieve the same thing.Chad J wrote:Ah. Thanks for the info.So suppose I have a function template, one that is supposed to be instantiated via IFTI. Then, the user supplies an argument that is constant (ex: foo(42,"cat")). Is there any way that I can grab those constant arguments at compile time and use them to do compile time computation? Even better, can I do it in variadic templates? I'm envisioning a situation like this: // the string-to-integer conversion is done at compile time bignum bigAssInteger = "3420894398526094609987620490236001914309690234";There's no syntax sugar for this at present. (Though I've proposed it, and there are indications that it will happen). But: bigAssInteger = toBigInt!("3420894398526094609987620490236001914309690234"); is currently possible. Until we get early discard of templates, it's not really a good idea right now because compilation is slow while the compiler generates an enormous obj file full of junk.
Feb 01 2007