digitalmars.D.learn - Prevent default-initialised struct
- Daniel Keep (11/11) Jan 26 2009 Hi all,
- BCS (2/17) Jan 26 2009 struct S { private static S opCall(); } //???
- Denis Koroskin (3/17) Jan 26 2009 Nope:
- grauzone (21/21) Jan 28 2009 I think it would really suck to introduce special cases to forbid
- Daniel Keep (4/5) Jan 28 2009 That would defeat the purpose of defining a non_null template in the
- Christopher Wright (21/37) Jan 28 2009 struct non_null(T : class)
Hi all,
is there any way to prevent a struct from being created directly?
Basically, I want to prevent this:
{
non_null!(T) a;
}
I want people to have to use provided functions to create a structure:
{
auto a = non_null!(T)(new T);
}
-- Daniel
Jan 26 2009
Hello Daniel,
Hi all,
is there any way to prevent a struct from being created directly?
Basically, I want to prevent this:
{
non_null!(T) a;
}
I want people to have to use provided functions to create a structure:
{
auto a = non_null!(T)(new T);
}
-- Daniel
struct S { private static S opCall(); } //???
Jan 26 2009
On Mon, 26 Jan 2009 20:40:01 +0300, BCS <none anon.com> wrote:Hello Daniel,Nope: S s; //okayHi all, is there any way to prevent a struct from being created directly? Basically, I want to prevent this: { non_null!(T) a; } I want people to have to use provided functions to create a structure: { auto a = non_null!(T)(new T); } -- Danielstruct S { private static S opCall(); } //???
Jan 26 2009
I think it would really suck to introduce special cases to forbid
default initialization of structs. And assuming T was the type of the
struct, what would T.init do? Or typeid(T).init()?
Use a class instead.
If you really need a struct, you could use a private field, that signals
if the struct was properly initialized.
E.g.
struct Foo {
debug private bool initialized;
static Foo opCall() {
Foo n;
debug n.initialized = true;
return n;
}
void foo() {
assert (initialized);
//do something useful
}
}
Jan 28 2009
grauzone wrote:Use a class instead.That would defeat the purpose of defining a non_null template in the first place. -- Daniel
Jan 28 2009
Daniel Keep wrote:
Hi all,
is there any way to prevent a struct from being created directly?
Basically, I want to prevent this:
{
non_null!(T) a;
}
I want people to have to use provided functions to create a structure:
{
auto a = non_null!(T)(new T);
}
-- Daniel
struct non_null(T : class)
{
// this should be private, but no can do
// an alternative is to obscure _member somehow,
// say, as a void*, just to make sure that nobody
// uses it without it being obvious that they're doing
// something bad
T _member;
T opDot ()
{
if (_member is null) _member = new T;
return T;
}
non_null!(T) opAssign(T value)
{
demand (value !is null);
_member = value;
}
}
Jan 28 2009









"Denis Koroskin" <2korden gmail.com> 