2014-10-01 4 views
1

У меня есть код, который ожидает такую ​​функцию, как test. Третья сторона ожидает, что это будет похоже на test2. Использование кода ниже я назначена функция test к fn1 и fn3rdParty, но я не знаю, как сделать fn1 работу с fn3rdPartyTypecast или вызов функтора в указатель функции?

Ошибка

ошибка C2440: «приведение типа»: не удается преобразовать из ' станд :: функция»до 'ничтожной * (__ Cdecl *) (пустота *)'

Код

class Data {}; 
void*test(Data*data) { return 0; } 
void*test2(void*data) { return 0; } 

function<void*(Data*)> fn1 = test; 
void*(*fn3rdParty)(void*) = test2; 
fn3rdParty = (void*(*)(void*))test; 
fn3rdParty = (void*(*)(void*))fn1;//error 
+0

Должен быть лучший способ сделать это ...;) –

ответ

0

, но я не знаю, как сделать работу с fN1 fn3rdParty

Попробуйте это:

// this is outside your code's scope, as a 
// local function (eventually placed in a namespace) 
void adapt_fn1(void* data) { return fn1(reinterpret_cast<Data*>(data); } 

// client code: 
fn3rdParty = adapt_fn1; 

Тем не менее, если вы можете адаптировать код сервера (тот, который навязывает функцию например, «тест»), чтобы ожидать std::function<void()>, вы сможете подключить что-либо к этому (и если у вас нет соответствующей подписи в клиентском коде, вы можете просто использовать лямбду, переданную в std::function<void(void)>).

+0

Ну, я могу сделать fn1 и данные в «пару» и передать его в функцию адаптации, которая вызывает функтор с аргументом, но это дополнительная функция вызов и дополнительный перенос данных. Ваш код немного некорректен, потому что fn1 является локальной переменной функции, поэтому не может быть доступ к этой функции, если я не помещаю ее в глобальную переменную, которую я не хочу делать, таким образом, дополнительный перенос – 2014-10-01 09:15:43

+0

Посмотрите на std :: bind как альтернативу (он создает функтор со связанными аргументами). Проблема с этим заключается в том, что вам все равно понадобится ваш серверный интерфейс, написанный с точки зрения 'std :: function'. – utnapistim