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

标签 c++ struct function-pointers

查看 C++ 接口(interface)代码。我无权访问实现。 我做了一个小例子来展示这种行为。

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

最佳答案

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

例如:

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

关于c++ - 在C++中定义带有函数参数的结构体方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71365310/

相关文章:

c++ - ostream 会刷新其他流吗?

go - 包的类型不能用作 vendor 包的类型

c++ - 引用成员的初始化需要一个临时变量

我们可以使用 static_assert 来检测结构中的填充吗?

c++ - std::function 指针错误:无法将 &A::a 转换为类型 std::function<>&&

c++ - 为什么 Doxygen 将此方法报告为属性?

c++ - 控制 paintGL 方法 - 如何决定绘制什么?

c++ - 通过按 Enter 完成编辑后更改或清除对 QLineEdit 的关注,并且仅在 Qt 中发送一个信号

delphi - 函数指针 - 初始值

c++ - 从函数隐式转换为函数指针?