Maison >développement back-end >C++ >Pourquoi `std::vector::reference` ne renvoie-t-il pas une référence `bool` ?

Pourquoi `std::vector::reference` ne renvoie-t-il pas une référence `bool` ?

DDD
DDDoriginal
2024-12-03 14:09:15559parcourir

Why Doesn't `std::vector::reference` Return a `bool` Reference?

Pourquoi 'vector::reference' ne renvoie pas de référence à 'bool' ?

Considérez l'exemple suivant :

#include <vector>

struct A
{
    void foo() {}
};

template<typename T>
void callIfToggled(bool v1, bool &v2, T &t)
{
    if (v1 != v2)
    {
        v2 = v1;
        t.foo();
    }
}

int main()
{
    std::vector<bool> v = {false, true, false};

    const bool f = false;
    A a;

    callIfToggled(f, v[0], a);
    callIfToggled(f, v[1], a);
    callIfToggled(f, v[2], a);
}

Ce code ne parvient pas à se compiler avec ce qui suit erreur :

dk2.cpp:29:28: error: no matching function for call to 'callIfToggled(const bool&, std::vector<bool>::reference, A&amp;)'

Le problème se pose car 'std::vector' est un modèle spécialisé pour le type 'bool'.

Spécialisation vectorielle pour 'bool'

Dans le cas de 'std::vector', ' std::vector' est spécialisé pour le type 'bool'. Cela signifie que les mécanismes sous-jacents de stockage et d'accès aux données gèrent spécifiquement la nature binaire des valeurs « booléennes ». Par conséquent, 'std::vector::reference' ne renvoie pas une référence à un objet 'bool' mais plutôt une référence à une représentation interne optimisée pour les valeurs 'bool'.

'fixed_vector' et 'Boost Containers'

Pour atténuer ce problème, vous pouvez utiliser ce qui suit stratégie :

  1. Métaprogrammation de modèle 'fixed_vector' : Définissez un métaprogramme de modèle personnalisé appelé 'fixed_vector' qui spécialise 'std::vector' pour 'bool' et utilise 'char' comme le type de stockage sous-jacent. Cela vous permet de récupérer des références aux valeurs 'char', qui peuvent être interprétées comme des valeurs 'bool'.
  2. Bibliothèque 'Boost Containers' : Utilisez la bibliothèque 'Boost Containers', qui fournit une version non spécialisée de 'std::vector' et prend en charge les références aux valeurs « bool ».

Exemple d'utilisation de « fixed_vector » :

template<typename t, typename... p>
using fixed_vector = std::vector<typename foo<t>::type, p...>;

int main()
{
    fixed_vector<bool> v = {false, true, false};

    const bool f = false;
    A a;

    callIfToggled(f, v[0], a);
    callIfToggled(f, v[1], a);
    callIfToggled(f, v[2], a);
}

Exemple d'utilisation de « Boost Containers » :

#include <boost/container/vector.hpp>

int main()
{
    boost::container::vector<bool> v = {false, true, false};

    const bool f = false;
    A a;

    callIfToggled(f, v[0], a);
    callIfToggled(f, v[1], a);
    callIfToggled(f, v[2], a);
}

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn