检查类型是否是模板的实例化

Ped*_*rda 4 templates d constraints

我有结构


struct RGBA (T) {/* ... */}
struct BMPFile (DataT) if (is(DataT == RGBA)) {/* ... */}
Run Code Online (Sandbox Code Playgroud)

但是is(DataT == RGBA)因为DataT是一个类型而RGBA是一个模板,所以无法工作.相反,我需要检查,如果一个类型是一个模板的实例化以声明file


BMPFile!(RGBA!ushort) file;
Run Code Online (Sandbox Code Playgroud)

@FeepingCreature在评论中表示


    struct RGBA(T) {
        alias void isRGBAStruct;
    }
    struct BMPFile (DataT) if (is(DataT.isRGBAStruct)) {}
Run Code Online (Sandbox Code Playgroud)

虽然工作我没有提示alias void isRGBAStruct,这似乎是一个黑客.希望std.traits将涵盖这一点.

DK.*_*DK. 6

我认为你正试图过度具体.我要处理的方法是允许任何类型DataT,只要它实现我需要的任何接口.

我认为,在D2标准库中完成此操作的方法是使用类似的模板IsIntegral测试类型的各种属性.

例如,假设您的要求DataT就是它可以finangle.你可以写:

template IsAppropriate(DataT)
{
    enum IsAppropriate = is(typeof( { DataT d; d.finangle(); }() ));
}
Run Code Online (Sandbox Code Playgroud)

带上一粒盐:我没有测试过,但我相信这是基本模式.如果你不熟悉上面的内容,它正在做的是检查给定的匿名函数是否编译; 如果有可能就只能编译finangleDataT.