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); } -- Danielstruct 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); } -- Danielstruct 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