Как правильно передать массив unique_ptrs? - PullRequest
2 голосов
/ 01 декабря 2011

Является ли это правильным способом передачи массива unique_ptrs, если я не хочу копировать?

Другими словами, я хочу, чтобы все, что происходит с x, влияло на arr в вызывающей стороне.

void doWork( unique_ptr<Foo> x[] )
{
    // I want assignments to x to impact caller's arr
}

int main()
{
    unique_ptr<Foo> arr[10];
    doWork( arr );
}

Ответы [ 3 ]

10 голосов
/ 01 декабря 2011

Ваш код не имеет реальной проблемы, потому что массивы распадаются на указатели 1 при передаче таким образом (по значению). Тем не менее, следующее наверняка будет больше C ++:

typedef std::vector<std::unique_ptr<Foo> > FooVec;   // dynamic size
typedef std::array<std::unique_ptr<Foo>, 10> FooArr; // fixed size (10)

void doWork( FooVec& x ) // or FooArr&
{
    // I want assignments to x to impact caller's arr
}

int main()
{
    FooVec vec(10); 
    FooArr arr;
    doWork( vec );
}

1 Другими словами, это эквивалентно

void doWork( unique_ptr<Foo> *x )

Чтобы остановить распад, пройдите по ссылке:

void doWork( unique_ptr<Foo> (&x)[10] )
0 голосов
/ 01 декабря 2011

Вместо этого вы передаете указатель. Так как вы все равно не можете передавать массивы в функции, ваш код уже делает это - компилятор превратит любые указатели функций, объявленные как массивы, в указатели.

0 голосов
/ 01 декабря 2011

То, что вы делаете, хорошо для того, что вы хотите (хотя я не уверен, что это лучший дизайн).

Поскольку массивы затухают в указателях при передаче в функции, и функции, объявленные как принимающие массивы, корректируютсядля функций, принимающих указатели, внутри doWork, x находится указатель на массив unique_ptr<Foo> arr, объявленный в main, а назначения членам массива будут видны в main.

...