Thread overview | ||||||||
---|---|---|---|---|---|---|---|---|
|
January 26, 2009 Prevent default-initialised struct | ||||
---|---|---|---|---|
| ||||
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 |
January 26, 2009 Re: Prevent default-initialised struct | ||||
---|---|---|---|---|
| ||||
Posted in reply to Daniel Keep | 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(); } //???
|
January 26, 2009 Re: Prevent default-initialised struct | ||||
---|---|---|---|---|
| ||||
Posted in reply to BCS | On Mon, 26 Jan 2009 20:40:01 +0300, BCS <none@anon.com> wrote:
> 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(); } //???
>
>
Nope:
S s; //okay
|
January 28, 2009 Re: Prevent default-initialised struct | ||||
---|---|---|---|---|
| ||||
Posted in reply to Daniel Keep | 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 } } |
January 28, 2009 Re: Prevent default-initialised struct | ||||
---|---|---|---|---|
| ||||
Posted in reply to grauzone |
grauzone wrote:
> Use a class instead.
That would defeat the purpose of defining a non_null template in the first place.
-- Daniel
|
January 28, 2009 Re: Prevent default-initialised struct | ||||
---|---|---|---|---|
| ||||
Posted in reply to Daniel Keep | 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;
}
}
|
Copyright © 1999-2021 by the D Language Foundation