cpp
--- test.d
import std.stdio: writeln;
struct GVec(int N : 2, T) { T x = 0; T y = 0; }
struct GVec(int N : 3, T) { T x = 0; T y = 0; T z = 0; }
struct GVec(int N : 4, T) { T x = 0; T y = 0; T z = 0; T w = 0; }
alias GVec2(T = float) = GVec!(2, T);
alias GVec3(T = float) = GVec!(3, T);
alias GVec4(T = float) = GVec!(4, T);
void main()
{
import gvec;
GVec2!int x = GVec2!int(1, 2);
foo(x);
}
--- gvec.d
import std.stdio: writeln;
struct GVec2(T) { T x, y; }
struct GVec3(T) { T x, y, z; }
struct GVec4(T) { T x, y, z, w; }
void foo(GVec2!int x) {
writeln(x.x);
writeln(x.y);
}
D的GVec可以同时多次抽象使用.而C++是不行的.
cpp
元<类 A>构 B{
空 动作(){
打印("f");
}
};
元<动 A>构 B{
空 动作(){
打印("f");
}
};
空 主(){
B<整>a;
}
那个test.d要改成如下:
cpp
import std.stdio: writeln;
import gvec;
struct GVec(int N : 2, T) { GVec2!T _data; alias _data this; }
struct GVec(int N : 3, T) { GVec3!T _data; alias _data this; }
struct GVec(int N : 4, T) { GVec4!T _data; alias _data this; }
void main()
{
GVec2!int x = GVec2!int(1, 2);
foo(x);
}