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() );
}

Reply via email to