Static opCall Factory Method Doesn't Work for Inner Classes
eris
jvburnes at gmail.com
Tue Jan 12 08:58:41 PST 2010
Hello fellow D'ers...
I'm writing a message passing kernel and scheduler. "User-space" programs communicate with each other and the kernel through inboxes and outboxes which are allocated and tracked by the kernel. If a user-space program wants to allocate an inbox called "stdin" and an outbox called "stdout" currently they simply ask the kernel to create one for them.
For example:
auto my_stdin = kernel.createInbox(String)("stdin");
auto my_stdout = kernel.createOutbox(String)("stdout");
This works fine for me. It is a pain, however, to make a new "create" method everytime I want to define a new structure.
I'd much rather use the "static <classname> opCall" mechanism which allows you to simply call the classname to have it generate an instance of that class.
Now the static opCall pattern I've gotten to work:
class A {
...
static A opCall(args) {
return new A(args);
}
}
auto a = A(args);
That works fine if you want instances of a factory created by calling the factory. For example:
CarFactory car = CarFactory(args);
It's a little syntactically awkward, but it works. My problem is I want the kernel to act as a factory for inboxes, outboxes and a bunch of other things. I'd like this to work:
class Kernel {
...
class Inbox {
...
static Inbox opCall(char[] name) {
return new Inbox(name);
}
}
class Outbox {
...
static Outbox opCall(char[] name) {
return new Outbox(name);
}
}
...
}
That way I just create a static opCall method for each kernel object and I get a factory method which could be used like this...
auto my_inbox = kernel.Inbox("stdin");
auto my_outbox = kernel.Outbox("stdout");
BUT....
Every syntax combination in D to express a static opcall on an inner class doesn't work. Both 'ldc' and 'gdc' generate compiler errors that say that 'this' is not available for static opCalls. When I take the 'static' keyword off the opCall declaration the compiler error becomes something like: 'this' is required to access the opCall method.
I was getting pretty tired when I gave up on this last night, but the problem is still eluding me. Am I just trying to do this the wrong way? I know the "createInbox" method works. Perhaps I should make separate factories for every structure, but that seems harder than just making create methods.
If I can get this to work, I think I could create a mixin that would generate automatic factory methods.
(This is probably obvious and I was just too tired last night.)
Thanks for your help,
eris
More information about the Digitalmars-d-learn
mailing list