Jestem w trakcie tworzenia klasy wektorowej i próbuję znaleźć sposoby ponownego użycia maksymalnej ilości kodu dla wektorów o różnych rozmiarach. Oto prosty przykład:Przekazywanie tymczasowej struktury jako argumentu szablonu
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]; }
};
Chcę, zmienne składowe być publicznie dostępne. Ex:
Vector<float,2> vec;
printf("X: %.2f, Y: %.2f\n", vec.x, vec.y);
Co chciałbym zrobić coś na wzór tego:
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; }> {};
i go przesłonić struct w Unii:
template<typename T, unsigned int D, struct C>
class Vector
{
public:
union {
T v[D];
// Place the passed struct here
};
};
tam jest jakikolwiek możliwy sposób to zrobić? Jeśli to możliwe, nie chcę używać niczego poza biblioteką standardową. Z góry dziękuję.
EDYCJA: Po przeczytaniu wszystkich odpowiedzi, zrozumiałem, że sposób w jaki używam związków jest nieprawidłowy! Dziękuję @ M.M za wskazanie tego. Od tego czasu wybrałem inną trasę, ale wybrałem odpowiedź, która najlepiej pasuje do tego, czego szukałem w tamtym czasie. Jeszcze raz dziękuję za wszystkie mile widziane odpowiedzi poniżej!
czy rzeczywiście * * chcą przekazać struct do 'Vector' czy chcesz tylko zdefiniować wektor2/3/4, który daje wynik końcowy? Ta klasa nie wydaje się być bardzo przydatna dla rozmiarów> 6-8. Również nie chcesz 'T (0)' w twoim ctor, chcesz 'T {}' domyślnie go zainicjować. – kfsone
Nie jestem do końca pewien, co robisz, ale pamiętaj, że w C++ można przeczytać tylko ostatnio przypisanego członka związku; na przykład nie wolno pisać do 'v', a następnie czytać z' x'. –
Co powiedział @MM jest naprawdę ważne! Nie używaj 'union' do" konwertowania "wartości na inną. Spójrz na 'std :: tuple' i przeładuj' operator [] ', aby osiągnąć to, co chcesz zrobić. – Garf365