我不明白這段代碼是如何作業的。任何人都可以請給我一點啟發。我非常確定“引數包應該是最后一個引數”
void foo(auto&&...args1, auto&&... args2, auto&&... args3) {
std::cout << "args1:\n", ((std::cout << args1 << " "), ...);
std::cout << "args2:\n", ((std::cout << args2 << " "), ...);
std::cout << "args3:\n", ((std::cout << args3 << " "), ...);
}
int main(int argc, char** argv)
{
foo(1,2,3,4,5,6);
}
如果允許,我如何拆分 arg1、args2 和 args3?
編譯器(g -11)假定所有引數包除了 args3 都是空的,所以輸出是
args1:
args2:
args3:
1 2 3 4 5 6
uj5u.com熱心網友回復:
該宣告格式錯誤,不需要診斷,因為無法為第二個包指定或推斷任何模板引數。它只是一個函式(模板)的無效宣告,盡管編譯器可能不會警告你。
uj5u.com熱心網友回復:
如果允許,我如何拆分 arg1、args2 和 args3?
你不能。您可以做的是將模板包收集到一個引數中,使用std::tuple
template <typename... Args1, typename... Args2, typename... Args3>
void foo(std::tuple<Args1...> args1, std::tuple<Args2...> args2, std::tuple<Args3...> args3) {
auto out = []<std::size_t... Is>(std::string name, auto tup, std::index_sequence<Is...>)
{
std::cout << name << " ";
((std::cout << get<Is>(tup) << " "), ...);
std::cout << std::endl;
};
out("args1", args1, std::index_sequence_for<Args1...>{});
out("args2", args2, std::index_sequence_for<Args2...>{});
out("args3", args3, std::index_sequence_for<Args3...>{});
}
現場觀看
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/522374.html
標籤:C c 20
