查看 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;
}
uj5u.com熱心網友回復:
它希望您傳遞一個通用的可呼叫物件,例如一個 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
orF&&
而不是F&
. 或者F
,F&&
您可以將 lambda 運算式直接放入呼叫中,而不必先將其存盤在變數中。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/438346.html