Outils pour utilisateurs

Outils du site


prog:cpp:propagate_const

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Prochaine révision
Révision précédente
prog:cpp:propagate_const [2025/07/06 17:41] – Création avec propagate_const rootprog:cpp:propagate_const [2025/07/06 19:06] (Version actuelle) – Fix value_types root
Ligne 1: Ligne 1:
-=====propagate_const===== +=====Problématique de base======
- +
-====Présentation====+
  
 Soit une classe Y qui possède un membre de type classe X. L'objectif est que, si une méthode ''const'' de Y est appelée, il ne sera possible d'appeler que les méthodes ''const'' de X. Soit une classe Y qui possède un membre de type classe X. L'objectif est que, si une méthode ''const'' de Y est appelée, il ne sera possible d'appeler que les méthodes ''const'' de X.
Ligne 30: Ligne 28:
 </code> </code>
  
-====Sans propagate_const avec objet====+====Objet====
  
 <code cpp> <code cpp>
Ligne 62: Ligne 60:
 </code> </code>
  
-====Sans propagate_const avec pointeur====+====Pointeur====
  
 <code cpp> <code cpp>
Ligne 92: Ligne 90:
 </code> </code>
  
-====Sans propagate_const avec référence====+====Référence====
  
 <code cpp> <code cpp>
Ligne 123: Ligne 121:
 </code> </code>
  
-====Avec propagate_const et pointeur====+=====propagate_const===== 
 + 
 +====Pointeur====
  
 Fonctionne avec ''X*'', ''std::unique_ptr'' et ''std::shared_ptr''. Fonctionne avec ''X*'', ''std::unique_ptr'' et ''std::shared_ptr''.
  
 <code cpp> <code cpp>
 +#include <https://raw.githubusercontent.com/jbcoe/propagate_const/refs/heads/master/propagate_const.h>
 +
 struct Y { struct Y {
   Y() : m_ptrX(new X()) {};   Y() : m_ptrX(new X()) {};
Ligne 154: Ligne 156:
 </code> </code>
  
-====Sans propagate_const avec référence====+====Référence====
  
 Impossible. Impossible.
  
 +=====indirect_value=====
  
 +''indirect_value'' est un ''std::unique_ptr'' avec la préservation de ''const''. Il n'y a pas d'équivalent avec ''shared_ptr'' / ''pointeur'' / ''référence''.
 +
 +====Pointeur====
 +
 +<code cpp>
 +#include <https://raw.githubusercontent.com/jbcoe/indirect_value/refs/heads/main/indirect_value.h>
 +
 +struct Y {
 +  Y() : m_ptrX(isocpp_p1950::make_indirect_value<X>()) {};
 +
 +  void f() const {
 +    std::cout << "f (const)\n";
 +    m_ptrX->g();
 +  }
 +
 +  void f() {
 +    std::cout << "f (non-const)\n";
 +    m_ptrX->g();
 +  }
 +
 +  isocpp_p1950::indirect_value<X> m_ptrX;
 +};
 +</code>
 +
 +Rendu :
 +
 +<code>
 +f (non-const)
 +g (non-const)
 +f (const)
 +g (const)
 +</code>
 +
 +=====value_types=====
 +
 +====Référence====
 +
 +<code cpp>
 +#include <https://raw.githubusercontent.com/jbcoe/value_types/refs/heads/main/polymorphic.h>
 +
 +struct Y {
 +  Y() : m_ptrX(m_X) {};
 +
 +  void f() const {
 +    std::cout << "f (const)\n";
 +    m_ptrX->g();
 +  }
 +
 +  void f() {
 +    std::cout << "f (non-const)\n";
 +    m_ptrX->g();
 +  }
 +
 +  xyz::indirect<X> m_ptrX;
 +  X m_X;
 +};
 +</code>
 +
 +Rendu :
 +
 +<code>
 +f (non-const)
 +g (non-const)
 +f (const)
 +g (const)
 +</code>
 +
 +====Pointeur / allocation dynamique====
 +
 +<code cpp>
 +#include <https://raw.githubusercontent.com/jbcoe/value_types/refs/heads/main/polymorphic.h>
 +
 +struct Y
 +{
 +  Y() : m_ptrX(xyz::polymorphic<X>()) {};
 + 
 +  void f() const {
 +    std::cout << "f (const)\n";
 +    m_ptrX->g();
 +  }
 + 
 +  void f() {
 +    std::cout << "f (non-const)\n";
 +    m_ptrX->g();
 +  }
 + 
 +  xyz::polymorphic<X> m_ptrX;
 +};
 +</code>
 +
 +Rendu :
 +
 +<code>
 +f (non-const)
 +g (non-const)
 +f (const)
 +g (const)
 +</code>
prog/cpp/propagate_const.1751816484.txt.gz · Dernière modification : de root