2009-09-08 3 views
0

Предположим, у меня есть следующий код:boost :: bind accessors?

int f(int, int); 

int main() 
{ 
    SomeFunc(boost::bind(f, 1, 2)); 
} 

Из функции SomeFunc(), можно получить доступ к аргументы удерживаемых связанного типа? Что-то вроде этого (псевдокод):

// Obvious syntax issues... 
void SomeFunc(boost::bind& functor) 
{ 
    if(functor.function == &f) 
    { 
     if(functor.argument1 == 1) 
      DoSomething(); 
    } 
} 

Могу ли я вытащить эту информацию из типа подталкивание :: привязки?

+0

У вас есть ответ на этот вопрос, но если вы попытаетесь объяснить проблему, которая должна решить, вы можете найти решение реальной проблемы. – sbk

+0

дубликат http://stackoverflow.com/questions/1395312/access-boostfunction-arugments –

ответ

2

Реальный вопрос, почему вы хотите это сделать?
Я подозреваю, что вы не можете, но тот факт, что вы пытаетесь, немного беспокоит.

0

Нет, вы не можете сделать это с помощью boost::bind.

boost::bind только что генерирует своего рода объект-функтор, где все детали скрыты. Чем вы конструируете boost::function или boost::signal, и единственное, что вы можете сделать: выполнить. Вы даже не можете сравнить boost::function объектов.

В любом случае, неясно, что проблема, которую вы решаете. Такой подход выглядит неудобно для меня. Вы уверены, что действительно это нужно?

5

boost :: bind - это шаблонная функция, а не тип. Реальный тип, возвращаемый этой функцией, является своего рода функтором неуказанного типа. По сути, он, вероятно, возвращает много разных типов нестандартных в зависимости от того, что аргументы функции boost :: bind.

Поскольку тип не указан, и в библиотеке указывается только CopyConstructible, которая реализует operator() с соответствующим числом и типом аргументов (по одному для каждого заполнителя, типов, выводимых из метода/функции) и предлагает внутренний тип result_type, который совпадает с типом возврата этого оператора().

Интерфейс тех неуказанных классов, ну, неуточненный. Вероятно, он не будет предлагать аксессуар аргументам, и даже если это произойдет, и вы получите знания из изучения внутренних компонентов библиотеки, вы рискуете, что ваш код сломается с обновлениями в библиотеке (разработчик может изменить тип и весь интерфейс, который не публикуется публично).

Вся библиотека построена вокруг того факта, что вам не важно, какие аргументы или даже если какой-либо аргумент определен или используются только заполнители, вам остается только, чтобы результирующий объект был вызван с заданным интерфейсом ,

Так что нет, вы не можете.