求大神指教啊
uj5u.com熱心網友回復:
急急急啊!!!uj5u.com熱心網友回復:
http://www.cnblogs.com/xianyunhe/archive/2011/11/26/2264709.htmluj5u.com熱心網友回復:
因為有this指標引數的存在, 成員函式指標, 轉換成普通函式的話, 是需要對堆疊做特殊處理的.看下wtl對callback函式的處理就知道了.
需要使用聯合體來轉換, 并且this指標push到堆疊中.
uj5u.com熱心網友回復:
http://www.cnblogs.com/memset/p/thunk_in_cpp.html看這個帖子吧
uj5u.com熱心網友回復:
實在不行自己整一個吧
//轉換函式
template<class R, class T, class... Args>
auto turn(R(T::*f)(Args...)) {
return [f](T* t, Args... args) {
(t->*f)(args...);
};
}
//測驗
class A {
public:
int id;
A(int x) :id(x) {}
void f() {
cout << id << endl;
}
};
int main()
{
A a(233);
auto f = turn(&A::f);
f(&a);
return 0;
}
uj5u.com熱心網友回復:
你的代碼有問題吧,沒有這樣子的寫法的
uj5u.com熱心網友回復:
看這個你就懂了
https://www.cnblogs.com/findumars/p/8628053.html
uj5u.com熱心網友回復:
成員函式指標寬度根據編譯器不同而不同。
在VC編譯器中,可以有2、3倍指標長度。未知型別成員函式指標為4倍。
在這個編譯器下,如果普通的成員函式指標,僅有this的那種,倒是有各種寫法。
保存物件A地址。A* obj = 0x...;
保存函式地址 回傳值 (A::*func)(引數) = 0x...;
之前我寫代碼,它不允許我把 普通函式指標 與 成員函式指標相互轉化。
但心知肚明,底層其實都只是個函式,一個地址而已。資料寬度是一定的、相同的
所以如樓上所說,使用共用體
union
{
回傳值 (A::*func_T)(引數);
回傳值(*func_S)(引數);
}
強轉即可。
-----------------------------------------
但其實都玩的花。
非正道
下面說下正道的東西
----------------------------------------------------------------------
1.lambda,這個可以,但我不熟。
2.std::bind(函式地址,物件地址,該函式的引數...)//回傳可以回傳一個成員函式指標。這只是該函式的一個功能,這個函式兼容性似乎特別好,可以搞很多事情。
比如:
int A::func(int id)
{
return 0;
}
function<int(int)> callback = std::bind(&A::func,想呼叫哪個物件的這個函式就哪個物件的指標,placeholders::_1);
callback(id);
uj5u.com熱心網友回復:
你根本就沒說明白你要做什么.成員函式需要物件才能呼叫, 普通指標直接就可以呼叫.
所以從功能上, 要 物件+成員函式指標 才能等效一個普通指標,
你還缺東西呢.
如果是你已經有了物件(比如this), 可以用 bind 得到一個普通的函式物件, 等效于一個普通函式指標.
auto f = std::bind(&MemFun, this);
f();
uj5u.com熱心網友回復:
參考:
class Test
{
public:
void _Callback()
{
}
};
static void SCallBack(void* param)
{
if (param == NULL)
{
return;
}
Test* test = (Test*)param;
test->_Callback();
}
//// 1
typedef void(*CALLABLE)(void* param);
void Func(CALLABLE callAble, void* param)
{
callAble(param);
}
//// 2
template <class T>
void Func1(T callAble, void* param)
{
callAble(param);
}
//// 3
template <class T, class C>
void Func2(T callAble, C* ths)
{
(ths->*callAble)();
}
//// 4
template <class T>
void Func4(T callAble)
{
callAble();
}
int main(int argc, char *argv[])
{
// 請自己注意生命周期,必要的時候使用智能指標
Test test;
Func(SCallBack, &test);
Func1(SCallBack, &test);
Func2(&Test::_Callback, &test);
Func4([&test]()
{
test._Callback();
});
return 1;
}
或者:
搜索 windows thunk
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/63029.html
標籤:C++ 語言
