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

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

使用泛型STD:在一個類中具有成員函數的函數對象

使用泛型STD:在一個類中具有成員函數的函數對象

C++ C
蝴蝶不菲 2019-07-11 16:39:29
使用泛型STD:在一個類中具有成員函數的函數對象對于一個類,我想在一個類中存儲一些指向同一個類的成員函數的函數指針。map貯存std::function物品。但我在一開始就失敗了,這段代碼是:class Foo {     public:         void doSomething() {}         void bindFunction() {             // ERROR             std::function<void(void)> f = &Foo::doSomething;         }};我收到error C2064: term does not evaluate to a function taking 0 arguments在……里面xxcallobj結合一些奇怪的模板實例化錯誤。目前,我在Windows 8上使用VisualStudio 2010/2011,在Win 7上使用VS 10,它也失敗了。錯誤必須基于一些我不遵循的奇怪的C+規則。編輯:我知道不用助推。這是集成在MS編譯器中的C+11。
查看完整描述

3 回答

?
MMMHUHU

TA貢獻1834條經驗 獲得超8個贊

必須使用對象調用非靜態成員函數.也就是說,它總是隱式地傳遞“this”指針作為它的參數。

因為你std::function簽名指定您的函數不帶任何參數(<void(void)>),你必須綁定第一個(也是唯一的)論點。

std::function<void(void)> f = std::bind(&Foo::doSomething, this);

如果要用參數綁定函數,則需要指定占位符:

using namespace std::placeholders;std::function<void(int,int)> f = std::bind(&Foo::doSomethingArgs, this, _1, _2);

或者,如果編譯器支持C+11 lambdas:

std::function<void(int,int)> f = [=](int a, int b) {
    this->doSomethingArgs(a, b);}

(我手頭沒有C+11能力的編譯器現在就來所以我不能檢查這個。)


查看完整回答
反對 回復 2019-07-11
?
拉丁的傳說

TA貢獻1789條經驗 獲得超8個贊

要么你需要

std::function<void(Foo*)> f = &Foo::doSomething;

這樣就可以在任何實例上調用它,或者需要綁定特定的實例,例如this

std::function<void(void)> f = std::bind(&Foo::doSomething, this);


查看完整回答
反對 回復 2019-07-11
?
慕虎7371278

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

如果需要存儲成員函數類實例,您可以這樣做:

class MyClass{public:
    void MemberFunc(int value)
    {
      //do something
    }};// Store member function bindingauto callable = std::mem_fn(&MyClass::MemberFunc);
    // Call with late supplied 'this'MyClass myInst;callable(&myInst, 123);

如果沒有,存儲類型會是什么樣子?汽車?就像這樣:

std::_Mem_fn_wrap<void,void (__cdecl TestA::*)(int),TestA,int> callable

還可以將此函數存儲傳遞給標準函數綁定。

std::function<void(int)> binding = std::bind(callable, &testA, std::placeholders::_1);binding(123); // Call

過去和未來的注釋:一個舊的界面STD:Mem_func已經存在了,但后來被廢棄了。有一個建議,C+17,可以提出指向可調用成員函數的指針..這將是最受歡迎的。


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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