Bir vektör sınıfı oluşturma sürecindeyim ve farklı boyut vektörleri için maksimum kod miktarını yeniden kullanma yollarını bulmaya çalışıyorum.Şablon değişkeni olarak geçici yapı geçme
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]; }
};
ben üye değişkenler herkese açık olacak şekilde istiyorum: Burada temel bir örnek. Ör:
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; }> {};
ve birlik içinde bir yapı geçersiz adres:
template<typename T, unsigned int D, struct C>
class Vector
{
public:
union {
T v[D];
// Place the passed struct here
};
};
var mı ben yapmak istiyorum ne
Vector<float,2> vec;
printf("X: %.2f, Y: %.2f\n", vec.x, vec.y);
bu çizgisinde bir şeydir Bunu yapmanın herhangi bir yolu var mı? Mümkünse standart kütüphaneden başka bir şey kullanmak istemiyorum. Şimdiden teşekkürler.
EDIT: Tüm cevapları okuduktan sonra, sendikaları kullanma şeklimin yanlış olduğunu anladım! Bunu belirtmek için M.M'e teşekkür ederim. O zamandan beri farklı bir rotaya gitmeyi seçtim, ama o zaman aradığım şeyi en iyi şekilde karşılayan cevabı seçtim. Bir kez daha, tüm memnuniyetle karşıladığınız cevaplar için teşekkür ederim!
aslında * * Vector' 'için yapı geçmesi veya yapmak ister misiniz Son sonucu üreten Vector2/3/4'ü tanımlamanın bir yolunu mu istiyorsunuz? Bu sınıf> 6-8 bedenler için çok yararlı olacak gibi görünmüyor. Ayrıca, sizde 'T (0) 'istemiyorsanız,' T {}' varsayılanını başlatmak istersiniz. – kfsone
Yaptıklarınızdan tam olarak emin değilsiniz, fakat C++ 'da sadece birliğin en son atanan üyesinin okunabileceğini unutmayın; Örneğin. 'v' yazmasına izin verilmez, daha sonra x 'den okunur. –
What @ MM'nin söylediği gerçekten önemli! Bir değeri diğerine "dönüştürmek" için "sendika" kullanmayın. Ne yapmak istediğinizi başarmak için 'std :: tuple' ve operatörün aşırı yüklenmesine göz atın – Garf365