亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

將boost :: function降級為普通函數指針

將boost :: function降級為普通函數指針

C++
慕桂英4014372 2019-10-11 10:58:27
想要將boost :: bind傳遞給期望使用普通函數指針(簽名相同)的方法。typedef void TriggerProc_type(Variable*,void*);void InitVariable(TriggerProc_type *proc);boost::function<void (Variable*, void*)> triggerProc ...InitVariable(triggerProc);error C2664: 'InitVariable' : cannot convert parameter 1 from 'boost::function<Signature>' to 'void (__cdecl *)(type *,void *)'我可以避免存儲boost :: function,而直接通過綁定的函子,但是然后我得到類似的錯誤:error C2664: 'blah(void (__cdecl *)(type *,void *))' : cannot convert parameter1 from 'boost::_bi::bind_t<R,F,L>' to 'void (__cdecl *)(type *,void *)'
查看完整描述

3 回答

?
SMILET

TA貢獻1796條經驗 獲得超4個贊

有沒有人注意到接受的答案僅適用于瑣碎的案件?function <> :: target()返回可綁定到C回調的對象的唯一方法是,如果它是用可綁定到C回調的對象構造的。如果真是這樣,那么您可以直接綁定它并跳過所有無用的功能。


如果您考慮一下,這沒有任何神奇的解決方案。C風格的回調存儲為指向可執行代碼的單個指針。任何不平凡的boost :: function <>都將至少需要兩個指針:一個指向可執行代碼,另一個指向建立調用所需的數據(例如,對于綁定成員,則為“ this”指針)功能)。


將boost :: function和boost :: bind與C回調結合使用的正確方法是創建一個滿足回調簽名的shim函數,找出要調用的函數<>并對其進行調用。通常,C回調對于“用戶數據”將具有某種void *;那就是你存放函數指針的地方:


typedef void (*CallbackType)(int x, void* user_data);

void RegisterCallback(CallbackType cb, void* user_data);


void MyCallback(int x, void* userData) {

  boost::function<void(int)> pfn = static_cast<boost::function<void(int)> >(userData);

  pfn(x);

}


boost::function<void(int)> fn = boost::bind(myFunction(5));

RegisterCallback(MyCallback, &fn);

當然,如果您的回調簽名不包含某種類型的用戶數據指針,那么您就不走運了。但是,任何不包含用戶數據指針的回調在大多數實際情況下已經不可用,需要重寫。


查看完整回答
反對 回復 2019-10-11
?
肥皂起泡泡

TA貢獻1829條經驗 獲得超6個贊

我認為您想使用boost :: function的target()成員函數(不是那么滿口……)


#include <boost/function.hpp>

#include <iostream>


int f(int x)

{

  return x + x;

}


typedef int (*pointer_to_func)(int);


int

main()

{

  boost::function<int(int x)> g(f);


  if(*g.target<pointer_to_func>() == f) {

    std::cout << "g contains f" << std::endl;

  } else {

    std::cout << "g does not contain f" << std::endl;

  }


  return 0;

}


查看完整回答
反對 回復 2019-10-11
?
aluckdog

TA貢獻1847條經驗 獲得超7個贊

你能和bind一起使用嗎?


cb_t cb = *g.target<cb_t>(); //target returns null

這是設計使然。基本上,由于bind返回的是完全不同的類型,因此無法正常工作?;旧希壎ǔ绦虼韺ο鬅o法轉換為C函數指針(因為它不是一個:它是一個函數對象)。返回的類型boost::bind很復雜。當前的C ++標準不允許執行所需的任何好方法。C ++ 0x將配有一個decltype表達式,可在此處用于實現以下目的:


typedef decltype(bind(f, 3)) bind_t;

bind_t target = *g.target<bind_t>();

請注意,這可能會或可能不會。我無法對其進行測試。


查看完整回答
反對 回復 2019-10-11
  • 3 回答
  • 0 關注
  • 1056 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號