假设我有一个名为vec 4的类。它是一个模板,在大多数情况下可以是uint 8、float或int。其他情况也允许,但可能性较小。该类如下所示:
template<class T>
class vec4 {
public:
vec4(){}
virtual ~vec4(){}
union {
struct {
T x,y,z,w;
};
struct {
T r,g,b,a;
};
};
};
这有助于我在编写代码时以不同的方式思考问题,并允许我做其他很酷的事情,我相当喜欢适用的设计模式。
问题是我想扩展这个类,在它是32位浮点数的情况下,添加一些函数,这我能做到,我还想扩展这个并集,得到一个更进一步的数学范式,其中第三个成员是Tc,y,m,k。
我发现很难找到关于这个主题的材料。这段代码扩展了模板,允许专门的函数,但是,我也想扩展里面的联合。
template<>
class vec4<float> {
public:
vec4(){}
virtual ~vec4(){}
};
下面的专门化编译,但不允许我也访问成员作为一个x,y,z,w对象虽然;
template<>
class vec4<float> {
public:
vec4(){
this->i=0;
this->j=0;
this->k=0;
this->l=0;
}
vec4(float a){
this->i = a;
this->j = a;
this->k = a;
this->l = a;
}
union {
struct {
float i,j,k,l;
};
};
};
我可以加上这一行:
struct vec4<float>;
它会一直编译直到试图访问x,y,z,w成员;
1条答案
按热度按时间ux6nzvsh1#
也许在并集中不引入额外的名字是可能的,但是我不知道怎么做。但是有了额外的名字,你可以这样做:
编辑:您还可以将
ExtraMembers
隐藏在匿名或命名的名称空间中,但我认为不可能将其隐藏在vec4
内部。