我想实现一个函数,它接受可变数量的字符串并转发给打印函数,该函数需要每个字符串的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