在 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);
}
};
谁能给我解释一下这个结构定义中枚举结构函数成员的用法是什么?
根据我的理解,这个结构中的枚举可以将函数类型作为输入参数(函数指针?)
- 这是否意味着每当我们创建 MessageInfo 结构的对象时,我们都可以像下面这样调用此方法?
- 如何定义函数类型,换句话说,我应该用什么来代替“???”在以下代码中?
- 这种编码模型的优势是什么(更具体地说是枚举方法)?
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
可用于对每个成员应用相同的操作,而无需为每个成员重复自己。
签名有点不寻常。您通常会期望 F
或 F&&
而不是 F&
。使用 F
或 F&&
您可以将 lambda 表达式直接放入调用中,而不必先将其存储在变量中。
查看 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);
}
};
谁能给我解释一下这个结构定义中枚举结构函数成员的用法是什么?
根据我的理解,这个结构中的枚举可以将函数类型作为输入参数(函数指针?)
- 这是否意味着每当我们创建 MessageInfo 结构的对象时,我们都可以像下面这样调用此方法?
- 如何定义函数类型,换句话说,我应该用什么来代替“???”在以下代码中?
- 这种编码模型的优势是什么(更具体地说是枚举方法)?
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
可用于对每个成员应用相同的操作,而无需为每个成员重复自己。
签名有点不寻常。您通常会期望 F
或 F&&
而不是 F&
。使用 F
或 F&&
您可以将 lambda 表达式直接放入调用中,而不必先将其存储在变量中。