benutzerdefinierter erweiterter Vektortyp: z.B. float4 b = v.xxyz;

OpenCL, GCC und Clang haben einen überzeugenden VektortypErweiterungen.

Eines der Features, das mir am besten gefällt, ist die Möglichkeit, einen Swizzle wie folgt durchzuführen:

float4 a(1,2,3,4);
float4 b = a.xxyw;  //1124

Wie kann ich meine eigenen Vektorerweiterungen erstellen, um dies mit z. MSVC auch? Das Beste, was ich mir ausgedacht habe, ist etwas, das ich tun würdefloat4 b = a.xxyw() (siehe den Code unten). Meine Hauptfrage ist also, wie es möglich wäre, dies ohne das zu tun() Notation.

Falls sich jemand dafür interessiert, habe ich mir einen Code ausgedacht, der alle Permutationen mit define erstellt

#define DEF_SWIZ4(a,b,c,d)  Vec4 a##b##c##d() const { return Vec4(a, b, c, d); }
#define DEF_SWIZ3(a,b,c)    DEF_SWIZ4(a,b,c,x) DEF_SWIZ4(a,b,c,y) DEF_SWIZ4(a,b,c,z) DEF_SWIZ4(a,b,c,w)
#define DEF_SWIZ2(a,b)      DEF_SWIZ3(a,b,x) DEF_SWIZ3(a,b,y) DEF_SWIZ3(a,b,z) DEF_SWIZ3(a,b,w)
#define DEF_SWIZ1(a)        DEF_SWIZ2(a,x) DEF_SWIZ2(a,y) DEF_SWIZ2(a,z) DEF_SWIZ2(a,w)
#define DEF_SWIZ()          DEF_SWIZ1(x) DEF_SWIZ1(y) DEF_SWIZ1(z) DEF_SWIZ1(w)

class Vec4
{
public:
    double x, y, z, w;
    Vec4() : x(0), y(0), z(0), w(0) {}
    Vec4(double x, double y, double z, double w) : x(x), y(y), z(z), w(w) {}
    DEF_SWIZ()
};

#include <iostream>

int main()
{
    Vec4 v(1, 2, 3, 4);
    Vec4 s = v.yyxw();
    std::cout << s.x << " " << s.y << " " << s.z << " " << s.w << std::endl;
}

Antworten auf die Frage(0)

Ihre Antwort auf die Frage