2015-05-20 2 views
2

У меня есть этот 3D шаблон вектораинициализация распорки для специализированного шаблона вектора

template <class TYPE, class VEC> 
class Vec3TYPE{ 
public: 
union{ 
    struct{ TYPE x,y,z; }; 
    struct{ TYPE a,b,c; }; 
    TYPE array[3]; 
}; 
inline void set(const VEC& a){ x=a.x; z=a.y; z=a.z; }; 
inline void add(const VEC& a){ x+=a.x; z+=a.y; z+=a.z; }; 
// + some other methods .... doesn't matter 
} 

специализирована для двойного поплавка и Int

class Vec3i : public Vec3TYPE< int, Vec3i > { }; 
class Vec3f : public Vec3TYPE< float, Vec3f > { }; 
class Vec3d : public Vec3TYPE< double, Vec3d > { }; 

Я хотел бы сделать следующие вещи:

Инициализировать массив Vec3d под брекетами, например:

Vec3f myVec3fs[2] = { {1.0f,2.0f,3.0f}, {3.0f,2.0f,1.0f} }; 

проход {1.0f, 2.0f, 3.0f} к функции в качестве аргумента типа Vec3f, как это:

float someFunc(const Vec3f& a); 
float result = someFunc({1.0f,2.0f,3.0f}); 

Vec3d myVec3f; 
myVec3f.set({3.0f,2.0f,1.0f}); 
myVec3f.add({1.0f,2.0f,3.0f}); 

Прежде я обобщил мой класс Vec3 с помощью шаблонов (то есть, когда я определил Vec3d с нуля) , он работал просто отлично (по крайней мере, со стандартом C++ 11).

+0

Что такое ошибка и где вы определяете параметры шаблона? Компилятор не может выводить их из параметров конструктора. – MikeMB

ответ

3

Ваша проблема заключается в том, что, унаследовав Vec3X от Vec3TYPE, вы дисквалифицируете его как совокупный тип, поэтому вы не можете просто использовать агрегатную инициализацию, как хотите. Способ исправить это, чтобы сделать ваши типы псевдонимы для соответствующего Vec3Type конкретизации:

//just take one template param, we can work out what the second was 
template <class TYPE> 
class Vec3TYPE{ 
    //typedef VEC here 
    using VEC = Vec3TYPE<TYPE>; 
    //same as you had previously 
}; 

//alias instead of inherit 
using Vec3i = Vec3TYPE<int>; 
using Vec3f = Vec3TYPE<float>; 
using Vec3d = Vec3TYPE<double>; 
+0

отлично, спасибо –

Смежные вопросы