查看 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);
}
};
有人可以向我解释一下这个结构定义中枚举结构函数成员的用法吗?
根据我的理解,该结构中的枚举可以采用函数类型作为输入参数(函数指针?)
- 这是否意味着每当我们创建 MessageInfo 结构体的对象时,我们都可以像下面这样调用这个方法?
- 如何定义函数类型,换句话说,我应该使用什么来代替“???”在下面的代码中?
- 这种编码模型的优点是什么(更具体地说是枚举方法)?
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
可用于对每个成员应用相同的操作,而不必为每个成员重复操作。
签名有点不寻常。您通常会期望 F
或 F&&
而不是 F&
。使用 F
或 F&&
,您可以将 lambda 表达式直接放入调用中,而不必先将其存储在变量中。
关于c++ - 在C++中定义带有函数参数的结构体方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71365310/