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:

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!(
            __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