以下 C 函式摘自此處的第 151 - 157 行:
template <typename... T>
std::string JoinPaths(T const&... paths) {
boost::filesystem::path result;
int unpack[]{0, (result = result / boost::filesystem::path(paths), 0)...};
static_cast<void>(unpack);
return result.string();
}
該函式JoinPaths("foo", "bar", "doo.txt")將回傳一個std::string帶值的"foo/bar/doo.txt"(我認為)所以我理解該函式的語意。
我試圖理解return宣告前的兩行。unpack在ints陣列中,但是前導 0 和末尾的橢圓發生了什么(以及為什么)。有人可以解釋這是如何擴展的嗎?為什么是0?我認為static_cast有沒有阻止編譯器優化陣列?
uj5u.com熱心網友回復:
正如我在輸入時已經指出的那樣,它是執行折疊運算式的 C 17 之前的方法。
它使用一個本地臨時陣列 int 和逗號運算子,來偷走一堆本來應該是的東西:
result = result / paths[n]
轉換成整數運算式,最終產生:
int unpack[]{
0,
(result = result / paths[0], 0),
(result = result / paths[1], 0),
...,
(result = result / paths[N], 0)
};
這些天,將執行以下操作:
template <typename...Pathnames>
std::string JoinPaths( Pathnames...pathnames )
{
return (std::filesystem::path( pathnames ) / ...).string();
}
uj5u.com熱心網友回復:
int unpack[]{0, (result = result / boost::filesystem::path(paths), 0)...};
第一個0是如果有人使用零引數呼叫函式,則不要嘗試創建空陣列。
(result = result / boost::filesystem::path(paths), 0)
這會評估result = result / boost::filesystem::path(paths)并丟棄它。結果是0逗號的右側。
...“展開”運算式(這是一個折疊運算式),,在每個運算式之間放置一個,使其變為:
int unpack[]{0, (result = result / boost::filesystem::path("foo"),0),
(result = result / boost::filesystem::path("bar"),0),
(result = result / boost::filesystem::path("doo.txt"),0)
};
因此,將有四個0:s unpack。之后的轉換只是為了禁用有關未使用變數的警告unpack。
[[maybe_unused]] int unpack ... 本來可以用來洗掉現代 C 中的警告。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/328465.html
