On Friday, 24 June 2016 at 15:35:57 UTC, Steven Schveighoffer wrote:
On 6/24/16 11:15 AM, Smoke Adams wrote:
On Friday, 24 June 2016 at 03:16:58 UTC, Meta wrote:
On Friday, 24 June 2016 at 03:10:51 UTC, Mike Parker wrote:
Oh, perhaps I misunderstood your question. Do you meant this:

class Foo() {
   void bar() { Log(); }  // Pass reference to Foo instance
}

void doSomething() { Log(); } // Null reference

If so, the answer is no. And I don't see how that could work as a compile time parameter, given that the reference itself is a runtime
value.

It actually is possible. You just have to be explicit.

void log(alias self)(string s)
{
    pragma(msg, self.stringof);
}

struct Test
{
    void test(string s)
    {
        log!this(s);
    }
}

void main()
{
    Test t;
    t.test("asdf");
}

I don't want to be explicit! One can be explicit with __FILE__ too but
one doesn't have to be.

__FILE__ is a constant, so is __LINE__. __THIS__ would not be, so this is somewhat different.

With UFCS, you can get close:

void log(T)(T obj, string s)
{
   ...
}

struct Test
{
   void test(string s)
   {
      this.log(s);
   }
}

But I believe you have to call with explict 'this'.

Perhaps an opDispatch can help, but seems an awful lot to avoid explicit passing of this variable.

-Steve

The problem with UFCS is that I am using variadic parameters. The logging function isn't designed to accept the first parameter as this.

It would be much easier to simply have the compiler "insert" it using __THIS__. Just because it isn't constant isn't really that big of a deal to the compiler. It could just manually add the parameter at the end of of the arguments.


I would also have to convert all the calls to this.log.

This becomes problematic because not not all calls are inside objects.

We have __FUNCTION__ so, __THIS__ seems somewhat natural. Null for outside of objects is fine.


Reply via email to