2017-09-08 7 views
4

Dans ce morceau de codeExiste-t-il un moyen standard de remplacer un tableau booléen de type C?

void legacyFunction(int length, bool *bitset) 
{ 
    // stuff, lots of stuff 
} 

int main() 
{ 
    int somenumber = 6; 
    // somenumber is set to some value here 

    bool *isBitXSet = new bool[somenumber]; 
    // initialisation of isBitXSet. 

    legacyFunction(somenumber, isBitXSet); 

    delete[] isBitXSet; 
    return 0; 
} 

J'aimerais remplacer bool *isBitXSet = new bool[somenumber]; par quelque chose comme

std::vector<bool> isBitXset(somenumber, false); 

Mais je ne peux pas faire

legacyFunction(somenumber, isBitXSet.data()); 

parce data() n'existe pas pour std::vector<bool> . Et je ne peux pas changer l'interface de legacyFunction().

Existe-t-il une bonne alternative au tableau booléen de type C?

+0

Notez que la fonction membre 'data()' manquante n'est pas le seul problème. 'std :: vector ' est une spécialisation qui peut fournir une implémentation plus compacte. Ainsi, les éléments du «vecteur » et d'un tableau «bool» de style C peuvent ne pas se chevaucher. –

+0

Copie possible de [Alternative au vecteur ] (https://stackoverflow.com/questions/670308/alternative-to-vectorbool) – moooeeeep

+0

@moooeeeep Ouais, à droite, désolé. Normalement, je supprimerais la question moi-même. Mais j'aime la réponse donnée par Vittorio Romeo beaucoup plus que n'importe laquelle de ces réponses de 2009. – TobiMcNamobi

Répondre

7

Vous pouvez utiliser std::unique_ptr<T[]> et std::make_unique:

int main() 
{ 
    int somenumber = 6; 
    // somenumber is set to some value here 

    auto isBitXSet = std::make_unique<bool[]>(somenumber);  
    // initialisation of isBitXSet. 

    legacyFunction(somenumber, isBitXSet.get()); 

    return 0; 
} 

Vous pouvez "truc" std::vector en créant votre propre emballage bool:

struct my_bool { bool _b; }; 
std::vector<my_bool> v; // will not use `vector<bool>` specialization 

Si vous connaissez le taille de votre tableau lors de la compilation, pensez à utiliser std::array.

+0

Est-ce que 'std :: array' n'est pas aussi une possibilité? – Rakete1111

+4

@ Rakete1111: pas si 'somenumber' est une valeur d'exécution, comme dans l'exemple. –

+0

Bonne réponse! Dans votre deuxième exemple: Comment est-ce que j'appliquerais ceci pour faire l'appel de fonction? Comme ceci 'legacyFunction (somenumber, reinterpret_cast (v.data())); – TobiMcNamobi