C ++ shared_ptr void - PullRequest
       6

C ++ shared_ptr void

1 голос
/ 13 марта 2020

Я столкнулся с проблемой. Я создал фрагмент кода C ++ из автоматизированного сценария. В этом я создаю объект, скажем, х, и он обрабатывается как хх. Это около 2000 обработчиков. Из-за этого есть вероятность, что имя объекта - x, а имя обработчика ошибочно - x, а не xx. Обратного не происходит. Поскольку обработчик имеет значение shared_ptr , он принимает это без какой-либо ошибки компилятора. То, что я ищу, это чтобы гарантировать ошибку компилятора и избежать ошибки времени выполнения. Код выглядит следующим образом.

#include <memory>
#include <iostream>
#include <string>   

using namespace std;

class A
{
public:
    void foo()
    {
        std::cout << "Foo";
    }

};
typedef shared_ptr<A> A_SharedPtr;
typedef shared_ptr<void> A_Handler;

struct packet
{
    A_SharedPtr mem_1;
    A_Handler   mem_2;
    packet(A_SharedPtr a1, A_Handler a2)
    {
        mem_1 = a1;
        mem_2 = a2;
    }
};


int main() {
    A_SharedPtr x;
    A_Handler xx;

    packet p1(x, x); //POTENTIAL ERROR WHICH LEADS TO RUNTIME EXCEPTION
    packet p2(x, xx);//CORRECT ONE

}

Не могли бы вы предположить, что программист получит ошибку компиляции при попытке

packet p1(x, x);

сказать, что второй аргумент неверен?

1 Ответ

3 голосов
/ 13 марта 2020

Вы можете delete нежелательная перегрузка

struct packet
{
    A_SharedPtr mem_1;
    A_Handler   mem_2;
    packet(A_SharedPtr, A_SharedPtr) = delete;
    packet(A_SharedPtr a1, A_Handler a2);
};
...