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
Libérer: 2024-12-03 14:09:15
original
646 Les gens l'ont consulté

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);
}
Copier après la connexion

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;)'
Copier après la connexion

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);
}
Copier après la connexion

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);
}
Copier après la connexion

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 de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal