"Value class instance" pattern?
Benjamin Thaut
code at benjamin-thaut.de
Sun Jul 14 02:30:54 PDT 2013
Am 13.07.2013 18:41, schrieb bearophile:
> 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
The problem with your version is that you will get something like:
Can't call ComposedClass.this with arguments (int, int, float)
With my version you will get:
Can't initialize object of type 'Foo' with arguments (int, int, float)
available ctors:
(int, int, int)
(int)
(float)
With my version you will instantly know what ctors are available and you
don't have to go look it up in the sourcecode.
Kind Regards
Benjamin Thaut
More information about the Digitalmars-d
mailing list