alias this of non-public member

via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Tue Apr 7 12:17:39 PDT 2015


On Tuesday, 7 April 2015 at 17:59:57 UTC, Daniel Kozak wrote:
> On Tuesday, 7 April 2015 at 17:43:08 UTC, Daniel Kozak wrote:
>> On Tuesday, 7 April 2015 at 17:21:09 UTC, Daniel Kozak wrote:
>>>
>>> On Tue, 07 Apr 2015 16:40:29 +0000
>>> via Digitalmars-d-learn <digitalmars-d-learn at puremagic.com> 
>>> wrote:
>>>
>>>> Hi!
>>>> 
>>>> Excuse me if this is obvious, but I can't recall coming 
>>>> across anything similar and a quick search returns nothing 
>>>> relevant:
>>>> 
>>>> struct Foo {
>>>> }
>>>> 
>>>> struct FooWrapper {
>>>>  alias x_ this;
>>>>  private Foo* x_; // doesn't work, as x_ is private
>>>> }
>>>> 
>>>> Basically, I want x_ to never be visible, except through the 
>>>> "alias this" mechanism, at which point it should instead be 
>>>> seen as public.
>>>> 
>>>> Assuming something like this is not already possible in a 
>>>> clean way, I would like to suggest a tiny(I think) addition 
>>>> to the language:
>>>> 
>>>> struct FooWrapper {
>>>>  public alias x_ this; // overrides the visibility through 
>>>> the alias;
>>>>  private Foo* x_;
>>>> }
>>>> 
>>>> 
>>>> While I think this would be useful for the language, the 
>>>> reason I want such a wrapper, is because I want to give 
>>>> opIndex, toString, to a pointer, or, in fact just value 
>>>> semantics, while keeping the rest of the interface through 
>>>> the pointer.
>>>> 
>>>> I thought about using a class instead of a struct pointer, 
>>>> but I am not sure about the memory layout for classes, nor 
>>>> about the efficiency of overriding Object's methods, so I 
>>>> didn't want to risk making it any less efficient. If someone 
>>>> could shed some light about D's class memory layout and 
>>>> general performance differences to a simple struct (or a C++ 
>>>> class for that matter), that would also be great. In 
>>>> general, more information about these sort of things would 
>>>> be great for us also-C++ programmers. :)
>>>
>>> Works for me:
>>>
>>> struct M
>>> {
>>> 	void callMe() {
>>> 		writeln("Ring...");
>>> 	}
>>> }
>>>
>>> struct S
>>> {
>>> 	alias m this;
>>> 	private M m;
>>> }
>>>
>>> void main(string[] args)
>>> {
>>> 	S s;
>>> 	s.callMe();
>>> }
>>
>> module some;
>> import std.stdio;
>>
>> Another way is use template mixin:
>>
>> private mixin template M()
>> {
>> 	int someVar = 7;
>> 	public void callMe() {
>> 		writeln("Call");
>> 	}
>>
>> 	public void callMe2() {
>> 		writeln("Call2");
>> 	}
>> }
>>
>> struct S
>> {
>> 	mixin M;
>> }
>>
>>
>> ////
>>
>> module main;
>> import some;
>> void main(string[] args)
>> {
>> 	S s;
>> 	s.callMe();
>> 	s.callMe2();
>> }
>
> And maybe Proxy can be use for your use case:
> http://dlang.org/phobos/std_typecons.html#.Proxy

Proxy doesn't really help here :(


More information about the Digitalmars-d-learn mailing list