Outils pour utilisateurs

Outils du site


lang:cpp:smartptr

Ceci est une ancienne révision du document !


C++ smart pointers fluentcpp

std::weak_ptr en tant que clé dans un conteneur

Il faut utiliser le comparateur owner_less.

std::map<U, T, std::owner_less<U>> destination;

Préserver l'attribut const sur les pointeurs

Il faut utiliser propagate_const.

Soit la classe commune X :

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();
}

Cas avec la classe ''X'' intégrée dans une classe ''Y'' avec pointeur classique

struct Y
{
  Y() { }
 
  void f() const
  {
    std::cout << "f (const)\n";
    m_ptrX.g();
  }
 
  void f()
  {
    std::cout << "f (non-const)\n";
    m_ptrX.g();
  }
 
  // Ici, X est une instance sans pointeur.
  X m_ptrX;
};

Rendu sans surprise :

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

Si la méthode f const est appelée, la méthode g const est appelée également car une méthode const ne peut pas appeler une méthode non const.

Cas avec un pointeur intelligent

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

Rendu :

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

On ne respecte la l'obligation d'appeler des méthodes const depuis une méthode const.

Cas avec un pointeur unique et propagate_const

Prérequis : minimum clang 3.9, gcc 6.1. Pas dans Visual Studio 2017 sauf sur GitHub.

#include <experimental/propagate_const>
  std::experimental::propagate_const<std::unique_ptr<X>> m_ptrX;

Rendu :

f (non-const)
g (non-const)
f (const)
g (const)
lang/cpp/smartptr.1622495315.txt.gz · Dernière modification : 2021/05/31 23:08 de root