簡體   English   中英

在C++中定義一個帶有function參數的struct方法

[英]Defining a struct method with function parameter in C++

查看 C++ 接口代碼。 我無權訪問實施。 我做了一個小例子來展示這種行為。

struct MessageInfo{
    
    MessageInfo() : length{}, from{}, to{} {}
    
    MessageInfo(int _length, string _from, string _to) : length{_length}, from{_from}, to{_to} 
    {}

    int length;
    string from;
    string to;
      
    using IsEnumerableTag = void;
    template<typename F>
    void enumerate(F& fun) {
        fun(this->length);
        fun(this->from);
        fun(this->to);
     }
};

有人可以向我解釋一下這個結構定義中枚舉結構 function 成員的用法是什么嗎?

根據我的理解,這個結構中的枚舉可以將 function 類型作為輸入參數(函數指針?)

  1. 這是否意味着每當我們創建一個 object 的 MessageInfo 結構時,我們都可以像下面這樣調用這個方法?
  2. 如何定義 function 類型,換句話說,我應該用什么代替“???” 在下面的代碼中?
  3. 這個 model 編碼的優點是什么(更具體地說是枚舉方法)?
MessageInfo messageInfo (1000, "A", "B");
    
messageInfo.enumerate<???>(printFrom(messageInfo.From);
      
void printFrom(string f) {
     cout<<"the msgInfo is sent from "<<  f<<endl;
}

它希望您傳遞一個通用的可調用對象,例如 lambda。您不必指定模板參數。 可以從function這個論證推導出來。

例如:

MessageInfo messageInfo (1000, "A", "B");

auto printFields = [](auto&& f){ std::cout << "Value of this field is " << f << ".\n"; };

messageInfo.enumerate(printFields);

哪個應該打印

Value of this field is 1000.
Value of this field is A.
Value of this field is B.

從這里可以看出, enumerate可用於對每個成員應用相同的操作,而不必為每個成員重復自己。

簽名有點不尋常。 您通常會期望FF&&而不是F& 使用FF&& ,您可以將 lambda 表達式直接放入調用中,而不必先將其存儲在變量中。

暫無
暫無

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

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