2012-03-09 1 views
0

Я пытаюсь создать копию boost::function с помощью указателя и вызвать эту функцию с помощью этого указателя. Мои вопросыcloning a boost :: function в указатель и вызов обернутой функции с помощью этого указателя

  1. Клонирование boost::function этак это что-то правильно
  2. вызов fp->target() должен вызывать или не функция, завернутые с помощью функции повышающего ::?

Большое спасибо

boost::function<void()> f = boost::bind(&my_f,my_value); 
    boost::function<void()> fp* = new boost::function<void()>(f); // clone f 

    typedef void(*fptr_type)(); 
    fp->target<fptr_type>(); // doesn't work! Is this correct? 

    fp->operator(); // doesn't compile 
        //=>error: statement cannot resolve address of overloaded function 
+2

Почему, о * почему * Вы 'new' копия ?! Пожалуйста, скажите мне * один * разумный разум. – Xeo

ответ

2

Если boost :: function предоставляет конструктор копирования, вы можете предположить, что он будет работать и позаботиться обо всех проблемах времени жизни f в этом случае (иначе он не будет предоставлен, и вы должны подать отчет об ошибке на их bugzilla).

fp->operator(); 

Есть только функция, что вы смысл сделать это:

fp->operator()(); 

Или, как указано выше плакат:

(*fp)(); 
1

Посмотрите этот код, я думаю, что это то, что вы хотите сделать:

void my_f(void) 
{ 
    cout << "hello"; 
} 

int main(void){ 

    boost::function<void()> f = boost::bind(&my_f); 
    boost::function<void()>* fp = new boost::function<void()>(f); 

    typedef void(*fptr_type)(); 
    fp->target<fptr_type>(); 

    (*fp)(); 
} 

Собран с GCC, и что хорошо работает, я могу видеть соиЬ.