Здравствуйте, pasenger, Вы писали:
P>Нечитаемость в данном случае означает использование малораспространенной лексики. Я вобщем не возражаю. Мне и хотелось найти какой-нибудь стандартный аналог.
Нет. Это ещё не обязано работать, кроме того игнорируется факт наличия деструкторов у объектов
P>И пока не видно стандартных способов определить переменную, не объявляя ее.
А что ты понимаешь, под "объявить не определяя"? ЧТо можно делать с переменной, которую уже "объявили", но ещё не определили?
P>>>Да, это работает. Но вроде зовутся лишние деструкторы.
Да что за деструкторы-то такие "лишние"?
E>>А почему бы их не сделать тривиальными, если они лишние?
P>Честно говоря, в данном случае я не возражаю. Видимо наиболее подходящий способ. Я как раз его и опубликовал в начале топика. Вопрос начинался на тему производительности.
Так тривиальные деструкторы
ничего не делают
E>>Зачем менять объекты, которые нельзя менять по их семантике?
E>>Приведи пример такого объекта, что ли...
P>В данный вопрос не хочется углубляться, потому что получиться отдельный, хотя, возможно, и интересный разговор.
P>Могу попробовать описать, как такая ситуация может возникнуть в реальности. Есть сторонняя библиотека без сорцов, какая-нибудь тяжелая нетривиальная математика, написанная людьми шарящими в математике и не шарящими в плюсах. И авторы библиотеки просто не заморачивались такими вещами, как копирование, "=". И со всем этим надо как-то жить.
Ну можешь пример класса оттуда привести? Хотя бы схематически? И зачем нужна его "отложенная инициализация" тоже...
P>Меня интересует стандартная конструкция, позволяющая делать то же, что делает этот "невалидный вызов конструктора" без внесения дополнительных ограничений и без потерь производительности.
P>Ну либо понять, что мне хочется невозможного. Кажется, дело к тому и идет.
Ты можешь понятно объяснить чего тебе надо сделать-то?
Например, с точностью до выравнивания (выравнивание можно рассмотреть отдельно) можно наваять что-то такое:
template<typename T> class ObjHolder {
public:
ObjHolder() : p ( 0 ) {}
~ObjHolder() { if( p != 0 ) p->~T(); p = 0; }
bool IsCreated() const { return p != 0; }
T& Get() { assert( p != 0 ); return *p; }
const T& Get() const { assert( p != 0 ); return *p; }
template<typename TArg1>
Init( TArg1 a1 ) { assert( p != 0 ); p = new( buffer )T( a1 ); }
template<typename TArg1, typename TArg2>
Init( TArg1 a1, TArg2 a2 ) { assert( p != 0 ); p = new( buffer )T( a1, a2 ); }
template<typename TArg1, typename TArg2, typename TArg3>
Init( TArg1 a1, TArg2 a2, TArg3 a3 ) { assert( p != 0 ); p = new( buffer )T( a1, a2, a3 ); }
private:
char buffer[sizeof( T )];
T* p;
};
Соответсвенно заводишь себе холдер, потом в нём создаёшь объект, когда надо.
Только я всё равно никак не пойму на кой это всё надо.
P>Вам-то кажется, что все это невообразимо коряво, а мне кажется, что это очень удобно. Но это вкусовщина, которая совершенно не важна.
Мне-то кажется, что это довольно опасно, а не коряво
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, pasenger, Вы писали:
P>Самое удивительное, что после всего, эта штука умудряется как-то работать.
Да ещё и довольно эффективно к тому же.
Короче не стоит с немытыми руками и в потроха. Особенно не до конца понимая, где можно получить по пальцам
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, pasenger, Вы писали:
P>Ага, спасибо. ВотАвтор: Erop
Дата: 02.10.07
говорят, что неопределенное поведение. Хотя тесты и на стеке и в динамической памяти вроде нормально себя ведут. Наверное, возникают проблемы, когда используемый класс каких-нибудь ресурсов наоткрывает, а мы потом затираем все концы новым конструктором.
Угу, проблемы будут, я же с этим не спорю. Это просто легальный и переносимый способ сделать то, то ты просил. Ты же хотел вызвать конструктор? Ну и получай... А траблы созданные тобой всё равно компилятор не решит и разруливать прийдётся самостоятельно.
Здравствуйте, ilnar, Вы писали:
I>извращенство какое!
I>сделайте просто функцию, выполняющий то что выполняет конструктор.
даже такой код вы считаете извращением?
for(; it!= it_e; ++it){
boost::thread thrd(boost::bind(&WorkThread, boost::cref(*it)));
}