2016-12-19 2 views
0

Итак, посмотрим, как можно передать адрес переменной в функцию, которая требует указатель типа так:Передача переменной функции, которая принимает интеллектуальный указатель в качестве параметра, без этой переменной, являющейся интеллектуальным указателем.

void func(int* x) 
{ 
    //some code 
} 
int y = 9; 

func(&y); 

Можно ли сделать что-то похожее на то, что выше, если функция была как следующие:

void func(std::unique_ptr x) 
{ 
    //some code 
} 

Как я могу передать его, если бы я не хотел делать ya unique_ptr по той или иной причине?

ответ

2

Если функция принимает аргумент std::unique_ptr<int>, то она ожидает получить право собственности на переменную. Конечно, вы не должны передавать ему адрес автоматической переменной. Вам нужно будет создать копию значения, например:

func(std::make_unique<int>(y)); 
1

Вы не можете. Это не имеет ничего общего с уникальным_ptr. Функция принимает список параметров определенных типов. Это единственные параметры, которые функция примет. Вот как работает C++.

варианты:

  1. преобразовать параметр типа, что функция хочет. Не вариант, если это unique_ptr.

  2. Напишите перегруженную версию функции, которая принимает другой параметр.

  3. Запишите функцию как функцию шаблона.

+0

Он мог передать 'smart-ptr.get()', чтобы передать неосязаемый необработанный указатель на функцию. –

0

Если std::unique_ptr имеет соответствующий конструктор, то да. Но вы должны создать шаблон функции в этом случае или, по крайней мере, указать тип вашего объекта (в вашем случае - int)

шаблона функции:

template<typename VarType> 
void func(std::unique_ptr<VarType> x) 
{ 
    //some code 
} 

Конкретный случай:

void func(std::unique_ptr<int> x) 
{ 
    //some code 
} 
Смежные вопросы