Если бы я хотел параметризовать создание объекта, я, конечно, мог бы создать функцию, которая вызывала бы new для определенного класса и передавала бы указатель. Мне интересно, можно ли пропустить этот шаг и передать указатель функции самому оператору new
.
Можно ли создать указатель функции на «новый» оператор/конструктор функции?
Ответы (2)
boost::lambda предоставляет функциональные оболочки для new
и delete
. Их можно использовать для простого преобразования вызова new
в объект функции.
person
bdonlan
schedule
07.07.2011
operator new
(как и другие варианты) занимается выделением памяти, но не создает объекты. На самом деле его возвращаемый тип — void*
. Объект создается новым выражением, которое является частью языка, а не функцией. Таким образом, невозможно сформировать указатель или ссылку на него; это так же бессмысленно, как формировать ссылку на return
.
person
Luc Danton
schedule
07.07.2011
Возможно, это невозможно, но уж точно не так бессмысленно, как создание ссылки на
return
.
- person Catskul; 07.07.2011
Ну, обычно вы использовали бы свой собственный новый указатель для выделения, а затем передавали результат в выражение нового размещения... это не совсем неслыханно.
- person Kerrek SB; 07.07.2011
@Catskul Вы не можете создать ссылку на функцию, которая не является функцией. Вот что бессмысленно.
- person Luc Danton; 07.07.2011
@Kerrek Обратите внимание, что это все еще новое выражение, создающее объект. И вы не можете сформировать ссылку на него, потому что это не функция.
- person Luc Danton; 07.07.2011
@Luc: да, конечно, вы не можете ссылаться на процесс создания объекта. Я не совсем уверен, чего пытается достичь ОП.
- person Kerrek SB; 07.07.2011
@ Люк Я не согласен, но концептуально в этом есть смысл. Фактически за сценой вызываются функции, malloc и, конечно же, конструктор.
- person Catskul; 07.07.2011
@Catskul Вы можете сказать это почти о каждом возможном выражении: в конце концов, в большинстве программ функции вызываются. Но позвольте мне уточнить; когда я говорю, что это бессмысленно, я имею в виду, что это бессмысленно согласно правилам языка. Например,
std::vector<42>
не имеет смысла. Это не было задумано как комментарий к тому, чего вы пытаетесь достичь, или к себе.
- person Luc Danton; 07.07.2011
pass a pointer to the new operator itself
, Что?!? - person karlphillip   schedule 07.07.2011void* (*np) (size_t) = &::operator new;
. Мне кажется, или вопросы со временем становятся все более и более византийскими? Бонусный вопрос: что происходит, когда выdelete np;
? - person Kerrek SB   schedule 07.07.2011