Здравствуйте Рек, Вы писали:
Рек>Здравствуйте konst, Вы писали:
K>>почему не работает
работает
K>>не буду спорить на счёт чистоты стиля, конечно, нет никакой
K>>вас интересовал инсёрт, вот, пожалуйста:
K>>K>>BOOL TCollect::Insert(int i, const void *item)
K>>{
K>> if( i == -1 ) i = Count();
K>> if( count == limit )
K>> {
K>> int newLimit = min(limit+delta, MaxCount());
K>> if( newLimit == count ) return error(IDS_SE_MANYITEMS, g_hInstanceNCall), FALSE;
K>> char *ni;
K>> if( ISNULL(ni=new char[newLimit*size_it]) ) return FALSE;
K>> if( count != 0 ) memcpy(ni, items, count*size_it);
K>> delete items; items = ni; limit = newLimit;
K>> }
K>> if( i < count ) memmove(items+(i+1)*size_it, items+i*size_it, (count-i)*size_it);
K>> count++;
K>> if( item ) memcpy(items+i*size_it, item, size_it);
K>> else memset(items+i*size_it, 0, size_it);
K>> return TRUE;
K>>}
K>>
K>>его я не стал искажать — можно и ошибиться
K>>и вы правы — вообще не для хранения объектов с деструктором и/или виртуальными функциями, а что делать
идеальные решения не так часто встречаются
Рек>Да. Наверное ты прав и такого типа контейнер сможет работать с некоторыми типами.
Рек>(только с типами, допускающими побитовое копирование — это простые типы (int, double, указатели), и структуры из них).
Рек>А для чего такое ограничение? Что ты получаешь взамен? Сверх эффективную memcpy ?
Рек>Но ведь типы, допускающие побитовое копирование, как правило малы по размерам,
Рек>и сомнительное преимущество memcpy тут никчему. Так что я не вижу никаких преимуществ этого метода.
Рек>Шаблоны тут используются всего лишь для "автоматизации приведения", для скрытия приведения.
Рек>А ведь шаблоны позволяют обойтись совсем без приведения. И позволяют работать с любыми типами.
Рек>Вот что главное!
Рек>Неужели Майерс?
Вообщем то примерно такой подход ещё и Элджер описывал.
Он таким образом скрывал от пользователя реализацию класса.
(у него вообще к программистам крайне негативное отношение

)