3 回答

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

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;
}

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>();
請注意,這可能會或可能不會。我無法對其進行測試。
- 3 回答
- 0 關注
- 1056 瀏覽
添加回答
舉報