我想實現一個函數,它接受可變數量的字符串並轉發給打印函數,該函數需要每個字符串的char
指針和size
交錯。括號內的參數包擴展給出奇怪的輸出
例子:
std::string a = "123";
std::string b = "1234";
forward(a, b); // should call doPrint(a.c_str(), a.size(), b.c_str(), b.size())
我認爲以下應該是一個正確的執行,但即使它編譯行爲很令我感到詫異。
template <class ...Args>
void forward(const Args & ... args) {
doPrint((args.c_str(), args.size())...);
}
forward(a, b)
調用doPrint(3, 4)
,而不是doPrint("123", 3, "1234", 4)
,好像我寫doPrint((args.size())...)
。編譯器完全忽略了對c_str()
的調用。
我試過g++
,clang
和icc
,它們都產生相同的輸出。 (args.c_str(), args.size())...
有什麼不對?
事實上,std::make_tuple(args.c_str(), args.size())...
按預期工作,但我們假設我不能更改doPrint
來接受和處理元組。
您的解決方案效果很好,謝謝!通過使用這個包裝器,我不必修改doPrint,只需添加新的重載。但我認爲這三個點應該是左邊的一個括號:'doPrint(std :: tuple_cat(...))'而不是'doPrint(std :: tuple_cat()...)',否則top-不會生成級別元組,tuple_cat或多或少是NOP。 –
然而,這需要C++ 14,所以我現在不能在我的代碼中使用它。 –
@GeorgiosBitzes你可以編寫你自己的'make_index_sequence'和'integer_sequence'。 – SirGuy