在模板特殊化类c++中扩展匿名联合

yzuktlbb  于 2023-01-03  发布在  其他
关注(0)|答案(1)|浏览(109)

假设我有一个名为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成员;

ux6nzvsh

ux6nzvsh1#

也许在并集中不引入额外的名字是可能的,但是我不知道怎么做。但是有了额外的名字,你可以这样做:

template<typename U>
struct ExtraMembers {};

template<class T>
class vec4 {
public:
    vec4(){}
    virtual ~vec4(){}

    union {
      struct {
        T x,y,z,w;
      };
      struct {
        T r,g,b,a;
      };
      ExtraMembers<T> extra;
    };
};

template<>
struct ExtraMembers<float> {float c, m, y, k;};

int main()
{
    vec4<int> a;
    vec4<float> d;
    // a.extra.c = 0; // Error: No member named 'c'
    d.extra.c = 0.;
}

编辑:您还可以将ExtraMembers隐藏在匿名或命名的名称空间中,但我认为不可能将其隐藏在vec4内部。

相关问题