How do you put log calls in constructors when they may be created in a static context?
aliak
something at something.com
Thu Aug 9 13:15:58 UTC 2018
On Thursday, 9 August 2018 at 12:01:42 UTC, Jonathan M Davis
wrote:
> On Thursday, August 9, 2018 2:37:49 AM MDT aliak via
> Digitalmars-d-learn wrote:
>> On Wednesday, 8 August 2018 at 23:47:22 UTC, Jonathan M Davis
>>
>> wrote:
>> > On Wednesday, August 8, 2018 3:54:34 PM MDT aliak via
>> >
>> > Digitalmars-d-learn wrote:
>> >> I'm trying to debug stuff, so I want to add verbose logging
>> >>
>> >> struct S(T) {
>> >>
>> >> this() {
>> >>
>> >> writeln("created S(T) with properties and ID");
>> >>
>> >> }
>> >>
>> >> }
>> >>
>> >> static a = S!int(); // bah
>> >>
>> >> I guess users can call this code from any context, but when
>> >> i'd also like to see the log output for debugging purposes.
>> >> Is there a way around this?
>> >>
>> >> Can I maybe only do a writeln in a non compile-time context?
>> >
>> > if(__ctfe)
>> > {
>> >
>> > // code here will execute if this is encountered during
>> > CTFE
>> >
>> > }
>> > else
>> > {
>> >
>> > // code here will execute if this is encountered outside
>> > of
>> >
>> > CTFE
>> > }
>> >
>> > - Jonathan M Davis
>>
>> That won't work because __ctfe is not readable at compile
>> time. And I don't want that writeln there when there's compile
>> time evaluation because errors.
>
> Huh? __ctfe's entire purpose is so that you can differentiate
> between code that's run at compile-time and code that's run at
> runtime. If a piece of code is executed at compile-time, __ctfe
> is true, whereas if it's executed at runtime, __ctfe is false.
> So, if you have
>
> this(T i)
> {
> if(!__ctfe)
> writeln("log it");
> }
>
> then the code will print "log it" if the object is constructed
> at runtime, whereas it won't print anything if it's run at
> compile time, and there won't be any errors for trying to call
> writeln at compile time, because it will have been skipped.
>
> - Jonathan M Davis
Maybe I'm just explaining what I'm trying to do wrong, but that
code doesn't compile when "this" is called in a valid compile
time evaluation context, you'll get errors:
https://run.dlang.io/is/KiJrR1
That link contains the gist of what I want to do. If you could
static if (__ctfe) ... then that'd work but I don't know if
there's something like that. Alternatively, if I can get a non
compile time evaluated static then that also will do the trick.
More information about the Digitalmars-d-learn
mailing list