這個問題在這里已經有了答案: 使用 std::ostream 列印可變引數包的最簡單方法是什么? (6 個回答) 2 小時前關閉。
我正在嘗試使用折疊運算式而不是模板遞回來撰寫可變引數模板列印。
目前我有
template <typename... Ts, typename charT, typename traits>
constexpr std::basic_ostream<charT, traits>& many_print(std::basic_ostream<charT, traits>& os, Ts... args){
os << '{';
(os << ... << args);
return os << '}';
}
對于 的呼叫many_print(1, 2);,輸出為{12}。
我想讓我的輸出是{1, 2}.
我所做的唯一一次近距離嘗試是
template <typename... Ts, typename charT, typename traits>
constexpr std::basic_ostream<charT, traits>& many_print(std::basic_ostream<charT, traits>& os, Ts... args){
os << '{';
(os << ... << ((void)(os << ", "), args));
return os << '}';
}
這使用逗號運算子列印", "每個 arg。不幸的是,由于排序順序,逗號在 arg 之前列印,導致{, 1, 2};
有沒有不使用模板遞回的解決方案?
我知道有 n-1 個逗號將是一個問題。如果我能得到輸出的代碼,我將不勝感激{1, 2, }。
uj5u.com熱心網友回復:
在這種情況下,沒有計算任何內容,您可以只對折疊本身使用逗號運算子:
((os << args << ", "),...)
使用狀態變數技巧,您甚至可以省略一個逗號:
int n=0;
((os << (n ? ", " : "") << args),...);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/515122.html
標籤:C 模板c 20折叠
上一篇:函式指標的自動模板推導
