首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在C++中定义带有函数参数的结构方法

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

Stack Overflow用户
提问于 2022-03-05 19:20:19
回答 1查看 112关注 0票数 2

查看C++接口代码。我没有机会获得执行。我举了一个小例子来说明这种行为。

代码语言:javascript
运行
复制
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. ,这种编码模型(更具体地说是枚举方法)的优点是什么?

代码语言:javascript
运行
复制
MessageInfo messageInfo (1000, "A", "B");
    
messageInfo.enumerate<???>(printFrom(messageInfo.From);
      
void printFrom(string f) {
     cout<<"the msgInfo is sent from "<<  f<<endl;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-05 19:32:29

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

例如:

代码语言:javascript
运行
复制
MessageInfo messageInfo (1000, "A", "B");

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

messageInfo.enumerate(printFields);

哪个应该打印

代码语言:javascript
运行
复制
Value of this field is 1000.
Value of this field is A.
Value of this field is B.

从这里可以看出,可以使用enumerate对每个成员应用相同的操作,而不必对每个成员重复自己的操作。

签名有点不寻常。通常您会期望FF&&而不是F&。使用FF&&,您可以将lambda表达式直接放入调用中,而不必先将其存储在变量中。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71365310

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档