2015-02-26 3 views
1
struct cls{ 
    ~cls(){std::cout<<"dtor\n";} 
}; 

void foo(cls** pp){ 
    *pp = new cls; 
} 

int main() 
{ 
    cls* raw_ptr = 0;  
    foo(&raw_ptr); 
    std::unique_ptr<cls> u_ptr{raw_ptr}; 
} 

Есть ли способ, чтобы получить прямой доступ к raw_pointer в unique_ptr, чтобы перейти к функции foo(cls** pp)?станд :: unique_ptr, как из аргумента функции

Или

cls* raw_ptr = 0;  
foo(&raw_ptr); 
std::unique_ptr<cls> u_ptr{raw_ptr}; 

Является ли это единственный способ?

Примечание: Я не могу изменить подпись функции foo.

+2

[ 'unique_ptr :: получить()'] (http://en.cppreference.com/w/cpp/memory/unique_ptr/get) – Biffen

ответ

2

Вы можете получить только для чтения доступ к указателю внутри unique_ptr с использованием unique_ptr::get(). Это возвращает копию сохраненного указателя.

Однако я понимаю ваш вопрос о том, есть ли способ изменить указатель в unique_ptrin situ; здесь, ответ нет. Вы должны сделать необработанный танец, который вы упомянули.

Конечно, даже если вы не можете изменить подпись foo, вы можете, конечно же, предоставить свою собственную функцию для переноса этого танца. Это может быть даже перегрузка foo:

std::unique_ptr<cls> foo() 
{ 
    cls *p = nullptr; 
    foo(&p); 
    return std::unique_ptr<cls>{p}; 
} 

[Live example]

-1

unique_ptr <> :: get() - возвращает указатель на принадлежащий ему объект, не отпуская права собственности на объект.

Смежные вопросы