On Friday, 7 April 2017 at 07:46:40 UTC, Ali Çehreli wrote:

Here is a solution:

auto objectFactory(ObjectType, Args...)(Args args) {
    import std.algorithm : cartesianProduct, map;
    import std.array : array;

return cartesianProduct(args).map!(a => ObjectType(a.expand)).array;
}

struct Pair {
    int number;
    string name;
}

import std.stdio;

void main() {
    auto pairKit = objectFactory!(Pair)([1, 2], ["qwe", "asd"]);
    auto pairSet = pairKit;
    writeln(pairSet);
}

Ali

I can't understand. Documentation of cartesianProduct points out about finite arrays. At least one of arrays must be a inifinte array. As far as I know finite arrays is `int[3]` and infinite is `int[]` (https://dlang.org/library/std/range/primitives/is_infinite.html). Am I right?

If I am then I can't understand why DMD return error about finite ranges compiling following code.

        struct Hay {
                int a;
                @disable this(this);
                @disable this();
                this(int a){
                        this.a = a;
                }
                
        }
        Hay[] params = [ Hay(1), Hay(23) ];
        auto products = cartesianProduct(params, params);

Error text:

static assert "cartesianProduct involving finite ranges must have at least one finite forward range"

I noticed that removing disabling default constructors helps. Does that mean an array contains objects of a struct with disabled default constructor is finite?


Reply via email to