boost::scoped_ptr
От: amberovsky  
Дата: 25.01.08 10:22
Оценка:
Hi, All.

Нужно сделать массив из scoped_ptr
scoped_ptr<MyType> MyArr[100];

Единственный способ, как я нашёл проинициализировать, это
MyArr[i].reset(..)

Можно ли сделать инициализацию при объявлении массива?
Или как-то покрасивее, нежели вручную прописывать по всем индексам.
Re: boost::scoped_ptr
От: zaufi Земля  
Дата: 25.01.08 10:37
Оценка:
Здравствуйте, amberovsky, Вы писали:

A>Hi, All.


A>Нужно сделать массив из scoped_ptr

A>scoped_ptr<MyType> MyArr[100];

A>Единственный способ, как я нашёл проинициализировать, это

A>MyArr[i].reset(..)

A>Можно ли сделать инициализацию при объявлении массива?

A>Или как-то покрасивее, нежели вручную прописывать по всем индексам.

ну это же array! единственный способ инитить его при объявлении сделать конструкцию вида

SomeType array[N] = { SomeType(...), SomeType(...), ..., SomeType(...) };


в целом это довольно просто сгенерить препроцессором (используя boost например)
Re: boost::scoped_ptr
От: Qbit86 Кипр
Дата: 25.01.08 10:54
Оценка:
Здравствуйте, amberovsky, Вы писали:

A>Нужно сделать массив из scoped_ptr...


А нужно ли? Может, больше подойдёт boost::scoped_array?
Глаза у меня добрые, но рубашка — смирительная!
Re[2]: boost::scoped_ptr
От: amberovsky  
Дата: 25.01.08 11:02
Оценка:
Здравствуйте, zaufi, Вы писали:

Z>Здравствуйте, amberovsky, Вы писали:


A>>Hi, All.


A>>Нужно сделать массив из scoped_ptr

A>>scoped_ptr<MyType> MyArr[100];

Z>
Z>SomeType array[N] = { SomeType(...), SomeType(...), ..., SomeType(...) };
Z>


Z>в целом это довольно просто сгенерить препроцессором (используя boost например)


1) scoped_ptr не позволяет так делать
2) в бусте написано, что создавать "безымянные" scoped_ptr — плохая идея.
Re[2]: boost::scoped_ptr
От: amberovsky  
Дата: 25.01.08 11:02
Оценка:
Здравствуйте, Qbit86, Вы писали:

Q>Здравствуйте, amberovsky, Вы писали:


A>>Нужно сделать массив из scoped_ptr...


Q>А нужно ли? Может, больше подойдёт boost::scoped_array?

Может. Как это понять?
Re[3]: boost::scoped_ptr
От: amberovsky  
Дата: 25.01.08 11:05
Оценка:
Всмысле нужен именно массив из scoped_ptr, а не scoped_ptr на массив.
Re: boost::scoped_ptr
От: s.ts  
Дата: 25.01.08 11:44
Оценка:
Здравствуйте, amberovsky, Вы писали:

A>Нужно сделать массив из scoped_ptr

A>scoped_ptr<MyType> MyArr[100];

A>Единственный способ, как я нашёл проинициализировать, это

A>MyArr[i].reset(..)

A>Можно ли сделать инициализацию при объявлении массива?

A>Или как-то покрасивее, нежели вручную прописывать по всем индексам.

Еще можно посмотреть в сторону контейнеров STL и Boost Assignment Library
Re[3]: boost::scoped_ptr
От: Qbit86 Кипр
Дата: 25.01.08 11:46
Оценка:
Здравствуйте, amberovsky, Вы писали:

A>>>Нужно сделать массив из scoped_ptr

A>>>scoped_ptr<MyType> MyArr[100];
A>...
Z>>
Z>>SomeType array[N] = { SomeType(...), SomeType(...), ..., SomeType(...) };
Z>>

A>...
A>1) scoped_ptr не позволяет так делать

Не позволяет, потому что он не CopyConstructible и не Assignable.

Поэтому, имхо, проще иметь дело не с сотней scoped_ptr'ов, а с одним scoped_array'ем. Всё равно вместо инициализации придётся использовать создание по умолчанию + присваивание. В этом смысле принципиальных причин scoped_ptr предпочесть scoped_array'ю я не вижу, тем более, что присваивать элементам массива проще, чем reset'ить scoped_ptr'ы. А время жизни элементов массива будет таким же, как и время жизни всего массива.

Если же хочется использовать что-то вроде «литеральной» инициализации, то можно создать обычный массив init_array, а затем уже его скопировать в рабочий scoped_array. Примерно так:
int const a[] = { 4, 6, 9 };
std::size_t const size = _countof(a);
boost::scoped_array<int> const p(new int[size]);
std::copy(&a[0], &a[size], &p[0]);
Глаза у меня добрые, но рубашка — смирительная!
Re: boost::scoped_ptr
От: dotidot Россия  
Дата: 25.01.08 15:34
Оценка: +1 :)
Здравствуйте, amberovsky, Вы писали:

A>Нужно сделать массив из scoped_ptr

A>scoped_ptr<MyType> MyArr[100];

есть глупое предположение, что вполне можно сделать
MyType MyArr[100];
безовсяких бустов.
Re: boost::scoped_ptr
От: _nn_  
Дата: 25.01.08 15:38
Оценка:
Здравствуйте, amberovsky, Вы писали:

A>Hi, All.


A>Нужно сделать массив из scoped_ptr

A>scoped_ptr<MyType> MyArr[100];

A>Единственный способ, как я нашёл проинициализировать, это

A>MyArr[i].reset(..)

A>Можно ли сделать инициализацию при объявлении массива?

A>Или как-то покрасивее, нежели вручную прописывать по всем индексам.

А почему тогда не boost::ptr_vector ?
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: boost::scoped_ptr
От: sraider http://dvinogradov.blogspot.com
Дата: 02.03.08 23:53
Оценка:
A>Нужно сделать массив из scoped_ptr
A>scoped_ptr<MyType> MyArr[100];

A>Единственный способ, как я нашёл проинициализировать, это

A>MyArr[i].reset(..)

A>Можно ли сделать инициализацию при объявлении массива?

A>Или как-то покрасивее, нежели вручную прописывать по всем индексам.

class MyScoped : boost:scoped_ptr<MyType>
{
    MyScoped() : boost:scoped_ptr<MyType>(xxx) { xxx }
};

MyScoped MyArr[100]
Re: boost::scoped_ptr
От: Аноним  
Дата: 03.03.08 08:40
Оценка:
Здравствуйте, amberovsky, Вы писали:

A>Hi, All.


A>Нужно сделать массив из scoped_ptr


Странное желание. Примерно как желание колоть орехи микроскопом.
scoped_ptr задуман для других вещей.
scoped в имени шаблона совсем не случаен.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.