How do you put log calls in constructors when they may be created in a static context?

Jonathan M Davis newsgroup.d at jmdavisprog.com
Thu Aug 9 12:01:42 UTC 2018


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





More information about the Digitalmars-d-learn mailing list