Benjamin Thaut:

I also wanted to mention the "ListAvailableCtors" template which is a nice addition in case there is no constructor available to be called with the given arguments. It will generate a list of all aviable ctors with the types of its arguments, and thus greatly improve the error message given when no appropriate constructor can be found:

string ListAvailableCtors(T)()
{
  string result = "";
  foreach(t; __traits(getOverloads, T, "__ctor"))
    result ~= typeof(t).stringof ~ "\n";
  return result;
}

In my original code it was used during construction like this:

static if(is(typeof(result.__ctor(args))))
{
  result.__ctor(args);
}
else
{
static assert(args.length == 0 && !is(typeof(T.__ctor)), "Don't know
  how to initialize an object of type " ~ T.stringof ~ " with
  arguments:\n" ~ ARGS.stringof ~ "\nAvailable ctors:\n" ~
  ListAvailableCtors!T() );
}

In my version of your code I have just added a template constraint, this is simpler, and it generates an error at the calling point:

    this(Targs...)(Targs args)
    if (__traits(compiles, _instance.__ctor(args))) {
        classInstanceBuf[] = typeid(T).init[];
        _instance.__ctor(args);
    }

Isn't this enough?

Bye,
bearophile

Reply via email to