3 votes

Comment utiliser les lambdas et les fonctions en tant que supprimeurs personnalisés pour unique_ptr

Je teste les supprimeurs personnalisés pour unique_ptr. Étrangement, seuls les supprimeurs qui sont des objets fonctionnels fonctionnent correctement. Si je les remplace par des fonctions ou des lambdas, le programme ne compile pas. Qu'est-ce que je fais mal?

Voici mon programme de test complet

#include 
#include 

using namespace std;

class Vehicle {
public:
    Vehicle(){ cout<<"Constructeur du véhicule..."<;
// Ne compile pas
//using VehiclePtr = unique_ptr;
// Fonctionne correctement
using VehiclePtr = unique_ptr;

class VehicleFactory {
public:
    static VehiclePtr createVehicle(string type){
        VehiclePtr vptr;
        if("bicycle"==type) {
            vptr.reset(new Bicycle());
            // Cela fonctionne également
            // vptr= (VehiclePtr) new Bicycle();
            return vptr;
        }
        else if("car"==type) {

           vptr.reset( new Car());
           return vptr;
        }

        return nullptr;
    }
};

void vehicleFactoryTest(){
    cout<<"* Démarrage de vehicleFactoryTest()..."<go();
    auto newCar = VehicleFactory::createVehicle("car");
    newCar->go();
}

int main(int, char **)
{
    vehicleFactoryTest();
    return 0;
}

5voto

Praetorian Points 47122

Le problème ne se situe pas avec l'un ou l'autre

using VehiclePtr = unique_ptr;

ou

using VehiclePtr = unique_ptr;

Ces deux compilent seuls. Le problème réside dans la ligne suivante à l'intérieur de createVehicle

VehiclePtr vptr;

Ici, vous êtes en train de construire par défaut un unique_ptr, ce qui ne compilera pas en cas de lambda deleter car les lambdas ne sont pas constructibles par défaut. Vous avez donc besoin de

VehiclePtr vptr{nullptr, CustomLambdaDeleter};

Dans le cas où vous utilisez un pointeur de fonction, vous essayez de construire par défaut le unique_ptr avec un deleter nullptr, ce qui n'est pas autorisé. La correction est similaire, vous devez passer un pointeur vers la fonction dans ce cas.

VehiclePtr vptr{nullptr, CustomFunctionDeleter};

Vous commettez également une erreur similaire dans l'instruction de retour finale dans createVehicle. Modifiez cette ligne pour

return vptr;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X