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:

```d
import std;

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

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

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

void main()
{
    writeln(foo());
    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.

Reply via email to