Bonjour,

je suis sur la construction d'un "gros" vecteur rassemblant plusieurs élément grâce à une fonction variadique et un container static :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 );
    }
}
Code : Sélectionner tout - Visualiser dans une fenêtre à part
error: the value of 'tuple_num' is not usable in a constant expression|
Merci d'avance !