How to return a reference to structs?

Andrey Zherikov andrey.zherikov at
Sat Nov 6 12:05:39 UTC 2021

On Saturday, 6 November 2021 at 04:28:05 UTC, Ali Çehreli wrote:
> On 11/5/21 5:43 PM, Andrey Zherikov wrote:
> In case others want to work, here are the modules that need to 
> be imported:
> import std.algorithm;
> import std.range;
> import std.stdio;
> > struct A {}
> > struct B
> > {
> >      A[] ar = [A.init];
> >      size_t[] idx = [0];
> I don't know why but those initial values are the reason for 
> the problem. It works without them.

`get()` will return nothing in this case. But I can make them non 
empty in another way:

import std;

struct A {}
struct B
     A[] ar;
     size_t[] idx;

     A*[] get()
         return!((idx) => &ar[idx]).array;

auto foo()
     B b; ~= A.init;
     b.idx ~= 0;
     return b.get();

void main()
     pragma(msg, foo());

Some one can complain that `foo()` returns pointers that are not 
available in CTFE but remember that the real code is more complex 
and `foo()` cam be return just length (`return b.get().length;`) 
having the same result.

Basically I have a collection of data (`A[] ar`), different 
addressing through the indexes (multiple `size_t[] idx`) and I 
want to manipulate these objects through indexes. If there is 
another way to achieve the same in CFTE, I'd like to hear.

More information about the Digitalmars-d-learn mailing list