Ik ben aan het proberen een c++ wrapper rond gsl vectors te schrijven. Deze bibliotheek is in C geschreven, met een groot aantal verschillende vector functies, voor verschillende basis typen, zoals allocatie functies
gsl_vector *gsl_vector_alloc( size_t n ) voor doubles, en
gsl_vector_float *gsl_vector_float_alloc( size_t n ) voor floats.
Nu probeer ik dat met partial specialized templates te wrappen:
Maar de code is niet bruikbaar:
Het lijkt er dus op dat de gespecialiseerde templates niet de constructor van de generieke class gebruiken. Waarom niet?
gsl_vector *gsl_vector_alloc( size_t n ) voor doubles, en
gsl_vector_float *gsl_vector_float_alloc( size_t n ) voor floats.
Nu probeer ik dat met partial specialized templates te wrappen:
C++:
Dit compileerd, en ik kan zo ook long double, int, ... toevoegen.1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
| template<typename BASE> class Vector { public: class VECTOR_BASE; inline VECTOR_BASE *vector_alloc( size_t ); inline vector_free( VECTOR_BASE * ); Vector( size_t n ) { m_pVector = vector_alloc( n ); } ~Vector() { vector_free( m_pVector ); } VECTOR_BASE *m_pVector }; template<> Vector<double> { public: typedef gsl_vector VECTOR_BASE; VECTOR_BASE *vector_alloc( size_t n ){ return gsl_vector_alloc( n ); } void vector_free( VECTOR_BASE *p ){ gsl_vector_free( p ); } }; template<> Vector<float> { public: typedef gsl_vector_float VECTOR_BASE; VECTOR_BASE *vector_alloc( size_t n ){ return gsl_vector_float_alloc( n ); } void vector_free( VECTOR_BASE *p ){ gsl_vector_float_free( p ); } }; |
Maar de code is niet bruikbaar:
C++:
geeft1
| Vector<double> v(3); |
code:
1
| error C2440: 'initializing' : cannot convert from 'int' to 'Vector<double>' |
C++:
compileerd OK. (Niet dat ik de code zo wil gebruiken)1
2
| Vector<double> v; Vector<double>::VECTOR_BASE *pv = v.vector_alloc( 3 ); |
Het lijkt er dus op dat de gespecialiseerde templates niet de constructor van de generieke class gebruiken. Waarom niet?