Thread overview
Prevent default-initialised struct
Jan 26, 2009
Daniel Keep
Jan 26, 2009
BCS
Jan 26, 2009
Denis Koroskin
Jan 28, 2009
grauzone
Jan 28, 2009
Daniel Keep
Jan 28, 2009
Christopher Wright
January 26, 2009
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
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
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
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
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
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;
	}
}