私はベクトルクラスを作成中ですが、異なるサイズのベクトルに対して最大量のコードを再利用する方法を見つけようとしています。一時的な構造体をテンプレート引数として渡す
template<typename T, unsigned int D>
class Vector
{
public:
union {
T v[D];
struct {
/* T x;
* T y;
* T z;
* T w;
*/
};
};
Vector()
{
for(unsigned int i=0; i<D; ++i)
(*this)[i] = T(0);
}
Vector(T scalar)
{
for(unsigned int i=0; i<D; ++i)
(*this)[i] = scalar;
}
inline T operator[](int i) { return (*this).v[i]; }
};
私はメンバ変数をパブリックにアクセス可能にしたい: ここで基本的な例です。例:
template<typename T>
class Vector2 : public Vector<T,2, struct { T x; T y; }> {};
template<typename T>
class Vector3 : public Vector<T,2, struct { T x; T y; T z; }> {};
、それが労働組合で構造体オーバーライドしています:
template<typename T, unsigned int D, struct C>
class Vector
{
public:
union {
T v[D];
// Place the passed struct here
};
};
はありますが、私が何をしたいのですがどのような
Vector<float,2> vec;
printf("X: %.2f, Y: %.2f\n", vec.x, vec.y);
本の線に沿って何かでありますこれを行う実現可能な方法?可能であれば標準ライブラリ以外のものを使用したくない。前もって感謝します。
編集:すべての回答を読んだ後、私は組合を使用している方法が間違っていることを理解しました!これを指摘してくれてありがとう@M。私は以来、別のルートを選択していますが、私はその時に探していたものに最も適した答えを選択しました。もう一度、以下のすべての歓迎された回答に感謝します!
は、あなたが実際に* * Vector' 'の中で構造体を渡すか、何をしたいですか最終結果を生成するVector2/3/4を定義する方法がほしいだけですか?このクラスは、> 6-8のサイズでは非常に便利なようではありません。また、 'T(0)'をあなたのctorに入れたくない場合は、 'T {}'がデフォルトで初期化されるようにします。 – kfsone
あなたが何をしているのかはまだ分かりませんが、C++では最も最近割り当てられた組合員だけが読むことができます。例えば'v'に書き込み、' x'から読み込むことは許されません。 –
@MMが言ったことは本当に重要です!値を別のものに「変換」するために「共用体」を使用しないでください。あなたは何をしたいのかを達成するために 'std :: tuple'と' operator [] 'のオーバーロードを見てください – Garf365