alias this private?
Ali Çehreli
acehreli at yahoo.com
Sun Dec 9 08:50:54 PST 2012
On 12/09/2012 01:42 AM, js.mdnq wrote:
> Actually, it doesn't seem to work ;/ Your code worked but mine does
> unless I make it public. It is a public/private issue and I get a ton of
> errors:
This is not adding to the discussion much but it is again because the
member is private. writeln() is in a separate module, which cannot
access a private member of another module. (Actually it is
std.traits.isImplicitlyConvertible that can't access that member.):
class A
{
struct B(T)
{
private:
//public:
T Value;
public:
alias Value this;
T opAssign(F)(F v)
{
//writeln(Name ~ " ...");
Value = cast(T)v;
return Value;
}
}
B!int b;
}
// Copied from isImplicitlyConvertible
template isImplicitlyConvertible_LOCAL(From, To)
{
enum bool isImplicitlyConvertible_LOCAL = is(typeof({
void fun(ref From v)
{
void gun(To) {}
gun(v);
}
}));
}
import std.traits;
int main(string[] argv)
{
A c = new A();
c.b = 34;
static assert(isImplicitlyConvertible_LOCAL!(A.B!int, int)); // PASSES
static assert(isImplicitlyConvertible !(A.B!int, int)); // FAILS
return 0;
}
> So while it might "work" in the simple case it doesn't seem to actually
> work...
I am not sure that it should work. If it is private, maybe it should
stay private.
What you seem to need is read-only access to a private member. There are
other ways of achieving that. The following program uses both a
read-only property function and an 'alias this':
module main;
import std.stdio;
class A
{
struct B(T)
{
private:
//public:
T Value_;
public:
// read-only accessor
T Value() const @property
{
return Value_;
}
// Automatic conversion to the read-only accessor
alias Value this;
T opAssign(F)(F v)
{
//writeln(Name ~ " ...");
Value_ = cast(T)v;
return Value_;
}
}
B!int b;
}
int main(string[] argv)
{
A c = new A();
c.b = 34;
writeln(c.b);
getchar();
return 0;
}
Ali
More information about the Digitalmars-d-learn
mailing list