My design need friends
Namespace
rswhite4 at googlemail.com
Fri Oct 11 16:32:42 PDT 2013
On Friday, 11 October 2013 at 22:39:18 UTC, Namespace wrote:
> On Sunday, 6 October 2013 at 13:11:02 UTC, Andrej Mitrovic
> wrote:
>> On 10/6/13, Namespace <rswhite4 at googlemail.com> wrote:
>>> And I should write a blog post about your and my solution. :)
>>
>> Let me try to hack on __PRETTY_FUNCTION__ first and I'll post a
>> working example here soon.
>
> Is there something new?
I have.
Foo_1:
----
import std.stdio;
import Bar_1;
struct friend(T) {
public:
alias Friend = T;
}
@friend!(Bar)
class Foo {
public:
void call(Bar b) {
_call_a_friend(b, this, &b.bar, 42);
//b.bar(42);
}
}
----
Bar_1:
----
import std.stdio;
import std.string : format;
class Bar {
package:
void bar(int id) {
writeln("Bar.bar with ", id);
}
}
void _call_a_friend(F, T, string filename = __FILE__, size_t line
= __LINE__, Args...)(const F friend, const T caller, void
delegate(Args) dg, Args args) {
bool isFriend = false;
foreach (attr; __traits(getAttributes, T)) {
isFriend = is(attr.Friend) && is(attr.Friend == F);
if (isFriend)
break;
}
//writeln(isFriend);
if (isFriend)
dg(args);
else
throw new Exception(format("%s is not a friend of %s.",
__traits(identifier, T), __traits(identifier, F)), filename,
line);
}
----
main:
----
import Foo_1;
import Bar_1;
void main() {
Foo f = new Foo();
Bar b = new Bar();
f.call(b);
}
----
I have to admit that the '_call_a_friend' method is a bit
parameter heavy. :D
Suggestions?
More information about the Digitalmars-d-learn
mailing list