在 C++ 中定义带有函数参数的结构方法

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

谁能给我解释一下这个结构定义中枚举结构函数成员的用法是什么?

根据我的理解,这个结构中的枚举可以将函数类型作为输入参数(函数指针?)

  1. 这是否意味着每当我们创建 MessageInfo 结构的对象时,我们都可以像下面这样调用此方法?
  2. 如何定义函数类型,换句话说,我应该用什么来代替“???”在以下代码中?
  3. 这种编码模型的优势是什么(更具体地说是枚举方法)?
MessageInfo messageInfo (1000, "A", "B");
    
messageInfo.enumerate<???>(printFrom(messageInfo.From);
      
void printFrom(string f) {
     cout<<"the msgInfo is sent from "<<  f<<endl;
}

它希望您传递一个通用的可调用对象,例如一个拉姆达。您不必指定模板参数。可以从函数参数推导出来。

例如:

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 表达式直接放入调用中,而不必先将其存储在变量中。