можно ли получить указатель на конструктор класса?
От: collider  
Дата: 10.06.10 08:09
Оценка:
Сабж. + можно ли как то выяснить есть ли у типа дефолтный конструтор?
Re: можно ли получить указатель на конструктор класса?
От: Bell Россия  
Дата: 10.06.10 08:24
Оценка:
Здравствуйте, collider, Вы писали:

C>Сабж. + можно ли как то выяснить есть ли у типа дефолтный конструтор?


Указатель получить нельзя.
Любите книгу — источник знаний (с) М.Горький
Re: можно ли получить указатель на конструктор класса?
От: Кодт Россия  
Дата: 10.06.10 11:26
Оценка: 1 (1)
Здравствуйте, collider, Вы писали:

C>Сабж. + можно ли как то выяснить есть ли у типа дефолтный конструтор?


Буст: проверка / биндинг к конструктору

А зачем, кстати, понадобился "указатель на конструктор"?
Может быть, пойдёт вот такая простенькая обёртка
template<class T> T* create() { return new T(); }
template<class T0, class T> T0* createDerived() { return new T(); }

.....
typedef Base* (*PFN_BaseCreator)();
PFN_BaseCreator creators[3] = { createDerived<Base,Foo>, createDerived<Base,Bar>, createDerived<Base,Buz> };
.....
Base* p = creators[1]();
assert(dynamic_cast<Bar*>(p));
Перекуём баги на фичи!
Re: можно ли получить указатель на конструктор класса?
От: unreg_flex  
Дата: 10.06.10 16:16
Оценка:
Здравствуйте, collider, Вы писали:

Именно на конструктор произвольного объекта можно только жутким хаком где в каждой строке UB, хотя получить указатель на другой метод вызывающий конструктор можно используя placement new.
Re[2]: можно ли получить указатель на конструктор класса?
От: dilmah США  
Дата: 10.06.10 16:23
Оценка:
_>хотя получить указатель на другой метод вызывающий конструктор можно используя placement new.

И, на какой метод? В голову приходит только operator new(size_t, void*) но он не вызывает конструктор.
Re[3]: можно ли получить указатель на конструктор класса?
От: Guard_h4s Россия  
Дата: 10.06.10 18:05
Оценка:
offtop:
D>В голову приходит только operator new(size_t, void*) но он не вызывает конструктор.
это placement new, он вызывает конструктор.
Re[4]: можно ли получить указатель на конструктор класса?
От: dilmah США  
Дата: 10.06.10 20:03
Оценка:
D>>В голову приходит только operator new(size_t, void*) но он не вызывает конструктор.
G_>это placement new, он вызывает конструктор.

operator new(size_t, void*) не вызывает конструктор

placement new это конструкция языка, на нее нет указателя.
Re[5]: можно ли получить указатель на конструктор класса?
От: Кодёнок  
Дата: 11.06.10 06:16
Оценка:
Здравствуйте, dilmah, Вы писали:

D>placement new это конструкция языка, на нее нет указателя.


Но можно звать new из вспомогательной функции, и взять указатель на нее
Re[5]: можно ли получить указатель на конструктор класса?
От: Guard_h4s Россия  
Дата: 11.06.10 09:39
Оценка:
D>operator new(size_t, void*) не вызывает конструктор
Да??
D>placement new это конструкция языка, на нее нет указателя.
я для кого написал "offtop"?
Re[6]: можно ли получить указатель на конструктор класса?
От: dilmah США  
Дата: 11.06.10 10:20
Оценка:
D>>operator new(size_t, void*) не вызывает конструктор
G_>Да??

вообще-то это общеизвестный факт. Дефолтный operator new(size_t, void*) выглядит так:

void* operator new(size_t, void* p) { return p; }
Re[6]: можно ли получить указатель на конструктор класса?
От: Кодт Россия  
Дата: 11.06.10 10:21
Оценка:
Здравствуйте, Guard_h4s, Вы писали:

D>>operator new(size_t, void*) не вызывает конструктор

G_>Да??

Представьте себе!
Оператор только выделяет память, в соответствии с указанными параметрами. А конструирование лежит уже на плечах выражения new.
Buz* p = new(foo,bar) Buz(a,b,c,d);

// эквивалентно

void* mem = Buz::operator new(sizeof(Buz),foo,bar); // выделяем память... может вылететь исключение!
//          ~~~~~ ищем подходящий оператор сперва в контексте класса, затем глобальный
if(mem)
{
  try
  {
    ((Buz*)mem)->__ctor(a,b,c,d); // вызываем конструктор... может вылететь исключение!
    // кстати, VC
  }
  catch(...)
  {
    Buz::operator delete(mem,foo,bar); // если не получилось, освобождаем память
    // оператор, парный к оператору выделения
    throw;
  }
}
p = (Buz*)mem; // если не было исключений, возвращаем указатель (возможно, нулевой!)


Наиболее известные выражения new — это
// выражение                оператор new                                 оператор delete
new               T(...)    void* T::operator new(size_t)                void T::operator delete(void*)
new(std::nothrow) T(...)    void* operator new(size_t,std::nothrow_t)    void operator delete(void*,std::nothrow_t)
new(buffer)       T(...)    void* operator new(size_t,void*)             void operator delete(void*,void*)
Перекуём баги на фичи!
Re[7]: можно ли получить указатель на конструктор класса?
От: Guard_h4s Россия  
Дата: 11.06.10 10:25
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Представьте себе!

Хорошо, уговорили!
Re[7]: можно ли получить указатель на конструктор класса?
От: Guard_h4s Россия  
Дата: 11.06.10 10:37
Оценка:
Здравствуйте, dilmah, Вы писали:

D>вообще-то это общеизвестный факт.

я просто перепутал оператор с выражением.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.