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将涵盖这一点.
我认为你正试图过度具体.我要处理的方法是允许任何类型DataT
,只要它实现我需要的任何接口.
我认为,在D2标准库中完成此操作的方法是使用类似的模板IsIntegral
测试类型的各种属性.
例如,假设您的要求DataT
就是它可以finangle
.你可以写:
template IsAppropriate(DataT)
{
enum IsAppropriate = is(typeof( { DataT d; d.finangle(); }() ));
}
Run Code Online (Sandbox Code Playgroud)
带上一粒盐:我没有测试过,但我相信这是基本模式.如果你不熟悉上面的内容,它正在做的是检查给定的匿名函数是否编译; 如果有可能就只能编译finangle
的DataT
.