On Saturday, 1 June 2019 at 23:29:08 UTC, SrMordred wrote:
On Saturday, 1 June 2019 at 21:39:33 UTC, SImen Kjærås wrote:
On Saturday, 1 June 2019 at 21:05:32 UTC, SrMordred wrote:

hasElaborateCopyConstructor checks if the type defines a postblit[0].
 Yes, I know this.

But since dmd 2.086 we have copy ctors:
https://dlang.org/changelog/2.086.0.html#copy_constructor

And its seem logical that if I want a trait that check if copy ctors exists I will use this name 'hasElaborateCopyConstructor'

So it looks like a naming issue for me.
Unless postblits will be eventually replaced by copy ctors.

Here's something I came up with to check for new-style copy constructors:

import std.traits;
import std.meta;

template hasNewCopyConstructor(T)
{
    static if (hasMember!(T, "__ctor")) {
        enum hasCopyConstructor = anySatisfy!(
            isNewCopyConstructor,
            __traits(getOverloads, T, "__ctor")
        );
    } else {
        enum hasNewCopyConstructor = false;
    }
}

enum isNewCopyConstructor(alias ctor) =
    is(Unqual!(Parameters!ctor[0]) == __traits(parent, ctor))
&& (ParameterStorageClassTuple!ctor[0] & ParameterStorageClass.ref_);

Haven't tested it extensively, so use at your own risk, but it should work.

Reply via email to