boost:bind изменение арг. с указателя на ссылку (и обратно)
От: SWayf  
Дата: 06.02.07 14:10
Оценка:
Вопрос в следующем. Скажем есть клиентская функция:

void DoSomething(boost::function<void(int&)> fn);


и есть функция член, которую надо использовать как аргумент к этой клиентской функции..
ее сигнатура:

void IInterface::Func(int*);


хватит ли boost::bind чтобы оформить функтор для клиенской функции, который вызывает Func?
Re: boost:bind изменение арг. с указателя на ссылку (и обрат
От: brav  
Дата: 06.02.07 14:26
Оценка:
Здравствуйте, SWayf, Вы писали:

SW>Вопрос в следующем. Скажем есть клиентская функция:


SW>
SW>void DoSomething(boost::function<void(int&)> fn);
SW>


SW>и есть функция член, которую надо использовать как аргумент к этой клиентской функции..

SW>ее сигнатура:

SW>
SW>void IInterface::Func(int*);
SW>


SW>хватит ли boost::bind чтобы оформить функтор для клиенской функции, который вызывает Func?



А почему нельзя описать одинаковую сигнатуру (либо указатель, либо ссылка)? В таком случае все получилось бы.
brav
Re[2]: boost:bind изменение арг. с указателя на ссылку (и об
От: SWayf  
Дата: 06.02.07 14:55
Оценка:
Здравствуйте, brav, Вы писали:

B>А почему нельзя описать одинаковую сигнатуру (либо указатель, либо ссылка)? В таком случае все получилось бы.


И та и другая сигнатура находятся в местах не подлежащих изменениям.. библиотеки
Проблема легко решается написанием своего функтора. Но такую адаптацию надо будет проводить для многих функций,
с различными сигнатурами, и часто только выщеописанное отличие не дает мне использовать boost::bind. Или мое незнание
boost::bind'а Вот это незнание хотелось бы как-нить елиминировать...
Re: boost:bind изменение арг. с указателя на ссылку (и обрат
От: Smal Россия  
Дата: 07.02.07 09:31
Оценка:
Здравствуйте, SWayf, Вы писали:

SW>Вопрос в следующем. Скажем есть клиентская функция:


SW>
SW>void DoSomething(boost::function<void(int&)> fn);
SW>


SW>и есть функция член, которую надо использовать как аргумент к этой клиентской функции..

SW>ее сигнатура:

SW>
SW>void IInterface::Func(int*);
SW>


SW>хватит ли boost::bind чтобы оформить функтор для клиенской функции, который вызывает Func?

Хватит.

void f( boost::function<void(int &)> fn )
{
   int a = 4;
   fn(a);
}

int * ref2ptr( int & i )
{
   return &i;
}

struct S
{
   void f1( int & i )
   {
      std::cout << "S::f1( " << i << " )\n";
   }

   void f2( int * i )
   {
      std::cout << "S::f2( " << *i << " )\n";
   }

};

void f1( int & i )
{
   std::cout << "f1( " << i << " )\n";
}

void f2( int * i )
{
   std::cout << "f2( " << *i << " )\n";
}

int main () 
{
   f( f1 );
   f( boost::bind(&f2, boost::bind(&ref2ptr, _1) ) );
   S s;
   f( boost::bind(&S::f1, s, _1 ) );
   f( boost::bind(&S::f2, s, boost::bind(&ref2ptr, _1) ) );
}
С уважением, Александр
Re[2]: boost:bind изменение арг. с указателя на ссылку (и об
От: SWayf  
Дата: 07.02.07 14:40
Оценка:
Здравствуйте, Smal, Вы писали:

S>...

S>[skipped]
S>...

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