Outils pour utilisateurs

Outils du site


prog:cpp:propagate_const

Ceci est une ancienne révision du document !


Problématique de base

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 la classe commune X :

#include <iostream>
 
struct X
{
  void g() const { std::cout << "g (const)\n"; }
  void g() { std::cout << "g (non-const)\n"; }
};

et le programme commun :

int main()
{
  Y y;
  y.f();
 
  const Y cy;
  cy.f();
}

Objet

struct Y
{
  Y() = default;
 
  void f() const
  {
    std::cout << "f (const)\n";
    m_ptrX.g();
  }
 
  void f()
  {
    std::cout << "f (non-const)\n";
    m_ptrX.g();
  }
 
  X m_ptrX;
};

Rendu :

f (non-const)
g (non-const)
f (const)
g (const)

Pointeur

struct Y
{
  Y() : m_ptrX(new X()) {};
 
  void f() const {
    std::cout << "f (const)\n";
    m_ptrX->g();
  }
 
  void f() {
    std::cout << "f (non-const)\n";
    m_ptrX->g();
  }
 
  X* m_ptrX;
};

Rendu :

f (non-const)
g (non-const)
f (const)
g (non-const)

Référence

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();
  }
 
  X& m_ptrX;
  X m_X;
};

Rendu :

f (non-const)
g (non-const)
f (const)
g (non-const)

propagate_const

Pointeur

Fonctionne avec X*, std::unique_ptr et std::shared_ptr.

struct Y {
  Y() : m_ptrX(new X()) {};
 
  void f() const {
    std::cout << "f (const)\n";
    m_ptrX->g();
  }
 
  void f() {
    std::cout << "f (non-const)\n";
    m_ptrX->g();
  }
 
   std::experimental::propagate_const<X*> m_ptrX;
};

Rendu :

f (non-const)
g (non-const)
f (const)
g (const)

Référence

Impossible.

prog/cpp/propagate_const.1751817197.txt.gz · Dernière modification : de root