簡體   English   中英

如何在函數聲明中聲明C ++ mem_fn(member_function)?

[英]How declare a C++ mem_fn(member_function) in function declaration?

我理解將成員函數的地址傳遞給它的類之外的基本問題。 我覺得mem_fn()可能是解決方案,但我遇到了具體問題。

我在類p中有一個當前聲明為的成員函數

typedef void (*valNamedFlagsCallback)(const int, const bool);
bool valNamedFlags(const OptBlk *operand, const char *description_of_value_or_NULL, const int subscripts[], const char *names[], valNamedFlagsCallback callBack);

在課堂上我試圖用valNamedFlags調用

pInstance->valNamedFlags(operand, "Statement types", statementsSubscripts, statementsNames, std::mem_fn(&e::setStatement));

(我從沒有mem_fn()開始,但當然有經典的“指向成員函數的指針”問題。我已經嘗試了兩個&e :: setStatement和plain&setStatement。)

FWIW,setStatement原型為

  void setStatement(const int ifcid, const bool isAffirmative);

如果我刪除mem_fn()並將setStatement聲明為static,則一切正常。 我只是指出這是一種說法,我已經消除了所有其他可能的問題; 我唯一的問題是“成員函數指針”問題。 不幸的是,setStatement()需要是一個成員函數,而不是靜態函數。

我在MS VS 2010中遇到的具體錯誤是

bool p :: valNamedFlags(const OptBlk *,const char *,const int [],const char * [],p :: valNamedFlagsCallback)':無法從'std :: tr1 :: _ Mem_fn3 <_Rx,_Pmf轉換參數5, _Arg0,_Arg1,_Arg2>'到'p :: valNamedFlagsCallback'

我想保持回調聲明獨立於e類; 也就是說,我不想去

typedef void (*e::valNamedFlagsCallback)(const int, const bool);

因為我想保持比這更普遍。

mem_fn()是正確的解決方案還是我離開基地? 如果是這樣,我應該如何在valNamedFlags()原型中聲明回調?

或者我應該采用不同的方法?

實際上,你會遇到像一些人建議的類似綁定的問題,因為你的回調被定義為一個簡單的函數指針,而不是一個可調用的。

如果你能負擔得起,你可以改變你的

typedef void (*valNamedFlagsCallback)(const int, const bool);

喜歡的東西

typedef std::function<void(int, bool)> valNamedFlagsCallback

(還注意到const on value參數不影響函數的簽名),那么你可以使用std::bind()

using namespace std::placeholders;

pInstance->valNamedFlags(operand,
      "Statement types", 
      statementsSubscripts,
      statementsNames,
      std::bind(&E::setStatement, e, _1, _2));

或者你可以使用lambdas:

pInstance->valNamedFlags(operand,
  "Statement types", 
  statementsSubscripts,
  statementsNames,
  [&](int i, bool b) { e->setStatement(i, b); });

如果你必須將它保持為一個簡單的函數,那么你必須發送一個引用正確對象作為全局/靜態變量的函數。

您需要bind它上面的實例以通過成員函數指針進行調用。 (即std::bind(&e::setStatement, eInstance, _1, _2) ,假設eInstance是指向類e )的對象的指針。

using namespace std::placeholders;  // for _1, _2, _3...
pInstance->valNamedFlags(operand, "Statement types", statementsSubscripts, statementsNames, std::bind(&e::setStatement, eInstance, _1, _2));

請注意, std::bind (未指定)的返回值與自由函數指針類型valNamedFlagsCallback不匹配,其中一個解決方案是使用std::function

typedef std::function<void(const int, const bool)> valNamedFlagsCallback;

簡化演示

得到它了!!! 謝謝大家!

原型:

bool valNamedFlags(const OptBlk *operand, const char *description_of_value_or_NULL, const int subscripts[], const char *names[], std::function<void(int,bool)> callBack);

呼叫:

valNamedFlags(..., std::bind(&e::setStatement, this, _1, _2));

實際上運行並使用正確的參數調用setStatement。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM