Bonjour,
je suis sur la construction d'un "gros" vecteur rassemblant plusieurs élément grâce à une fonction variadique et un container static :
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 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
| #ifndef BIGVECTOR_H_INCLUDED
#define BIGVECTOR_H_INCLUDED
#include <vector>
//- Container Static Vector Class -//
template < typename ValueType >
class Container {
public:
using Num_type = unsigned int;
using Value_type = ValueType;
static void Add( const ValueType& object ) { vector.push_back( object ); }
static const ValueType& Get( const Num_type num ) { return vector[ num ]; }
static void Erase( const Num_type num ) { vector.erase( vector.begin() + num ); }
private:
static std::vector< ValueType > vector;
};
template < typename ValueType >
std::vector< ValueType > Container< ValueType >::vector;
//- Add Variadic Argument -//
namespace ADD {
template< typename ValueType >
void Add( const ValueType& value ) {
Container< ValueType >::Add( value );
}
template< typename ValueType, typename ...TailType >
void Add( const ValueType& value, const TailType&... tail ) {
Container< ValueType >::Add( value );
Add( tail... );
}
}
//- Class Static BigVector -//
template< typename ...ValueTail >
class BigVector {
public:
using Num_type = unsigned int;
using NumVector_type = std::vector< Num_type >;
static void Push_back( const ValueTail&... value ) { ADD::Add( value... ); size++; }
//static void Erase( const Num_type num ) { ERASE::Erase< ValueTail... >( num ); }//Problème ici
template< typename ValueType >
static const ValueType& At( const Num_type num ) { return Container< ValueType >::Get( num ); }//Permet un accès selon le type
static const Num_type End() { return size; }
static const Num_type Begin() { return Num_type( 0 ); }
static const NumVector_type NumVector() { NumVector_type v; for( Num_type num = 0; num != size; num++ ) v.push_back( num ); return v; }
private:
static Num_type size;
};
template< typename ...ValueTail >
unsigned int BigVector< ValueTail... >::size = 0;
#endif // BIGVECTOR_H_INCLUDED |
Cette classe s’initialise avec une seconde ainsi :
1 2 3 4 5 6 7 8 9
| #ifndef BIGVECTORDEF_H_INCLUDED
#define BIGVECTORDEF_H_INCLUDED
#include "BigVector.h"
#include "Object.h"//Les objets qui devront être utilisés
using Data = BigVector< Date, Time, int, Job, Emp, float >;//Déclaration du gros vecteur
#endif // BIGVECTORDEF_H_INCLUDED |
# Premièrement, comment pourrais-je empêcher la création du BigVector avec plusieurs fois le même type :
using Data = BigVector< Date, int, Time, Job, Emp, int >; (Le nombre entier apparait deux fois, ce qui faussera le stockage static)
(Je pourrait simplement prévenir l'utilisateur mais je préférerais un message d'erreur)
# Deuxièmement, je n'arrive pas à trouver comment supprimer un groupe d'éléments :
J'ai essayé comme ceci :
1 2 3 4 5 6 7 8 9
| template< typename ValueType >
void Erase( const unsigned int num ) {
Container< ValueType >::Erase( num );
}
template< typename ValueType, typename ...TailType >
void Erase( const unsigned int num ) {
Container< ValueType >::Erase( num );
Erase< TailType... >( num );
} |
Seulement il ne peut choisir entre :
1 2
| void ERASE::Erase(unsigned int) [with ValueType = Emp]|
void ERASE::Erase(unsigned int) [with ValueType = Emp; TailType = {}]| |
J'ai aussi essayé avec un tuple, mais on ne peut accéder aux élément qu'avec un numéro contant :
1 2 3 4 5 6 7 8 9
|
template< typename NumType, typename ...TailType >
void Erase( const NumType num ) {
const std::tuple< TailType... > tuple;
const unsigned int size = std::tuple_size< decltype( tuple ) >::value;
for( int tuple_num = 0; tuple_num != size; tuple_num++ ) {
EraseConst< std::get< tuple_num >( tuple ) >( num );
}
} |
error: the value of 'tuple_num' is not usable in a constant expression|
Merci d'avance !
Partager