UFCS from within classes

Gyron Threk at web.de
Mon Sep 9 10:51:40 PDT 2013


On Monday, 9 September 2013 at 17:17:07 UTC, H. S. Teoh wrote:
> On Mon, Sep 09, 2013 at 07:07:58PM +0200, Gyron wrote:
>> Hey there, I've experimented a little with UFCS today and ran 
>> into a
>> problem.
>> 
>> My first question, which is kinda off-topic:
>> Why does D use the int type if you give it a number started 
>> with
>> 0x(hex), shouldn't it use uint for that ?
>
> Good point, please file a bug on: http://d.puremagic.com/issues
>
>
>> Here comes the real question:
>> I've extended the int by one function, which is the following 
>> (just
>> to represent the problem):
>> public static T read(T)(int address)
>> {
>> 	return cast(T)1;
>> }
>> 
>> It works perfectly if the function stands alone (is global), 
>> but it
>> doesn't work if I put it into a class (because I want it to be 
>> a bit
>> more organized) like that:
>> class CMemory
>> {
>> 	public static T read(T)(int address)
>> 	{
>> 		return cast(T)1;
>> 	}
>> }
>> 
>> I'm not able to write something like:
>> 0x1212.CMemory.read!bool();
>> 
>> 
>> So the question is, how can I make it to be able to be used 
>> like
>> this:
>> 0x1212.read!bool();
>> 
>> but still organized within the class ?
>
> I don't think UFCS works with qualified names right now. This 
> is a known
> issue. The best way to solve this problem is to put your 
> function in a
> separate module instead of a class, then importing the module 
> will pull
> it into your current namespace and you can use it as above, yet 
> have it
> organized by module (but not by class -- that's unfortunately 
> not
> possible right now). Something like this:
>
> 	----memory.d----
> 	module memory;
> 	T read(T)(int address) { ... }
>
> 	----main.d----
> 	import memory;
> 	void main() {
> 		0x1212.read!bool();
> 	}
>
>
> T

The thing is, that I already have other classes in that module 
and I hate to mix global functions(global in the means of global 
in the module) with classes.
I would separate them in different files, but sadly thats not 
possible (as far as I can see, because you can only define the 
module once, not like namespaces in c++).


More information about the Digitalmars-d-learn mailing list