C++ 如何检索整个va_列表输入
我熟悉va_arg列表。我想知道是否有一种方法可以获取逗号后的值 乙二醇 我想知道是否有可能在不进行任何处理的情况下将整个调用传递给字符串C++ 如何检索整个va_列表输入,c++,c,visual-c++,C++,C,Visual C++,我熟悉va_arg列表。我想知道是否有一种方法可以获取逗号后的值 乙二醇 我想知道是否有可能在不进行任何处理的情况下将整个调用传递给字符串 string [1]="%d %d %d how are you",1,2,3; 我不想做任何类型的处理,我只想读取整个调用并将其存储在一个数组字符串中。尽我所能理解您的要求,这在标准C++03中是不可能的。最密切相关的C++功能是预处理器宏参数的严格化,这将允许这样的事情: #define ABC(X) do { remember_string_vers
string [1]="%d %d %d how are you",1,2,3;
我不想做任何类型的处理,我只想读取整个调用并将其存储在一个数组字符串中。尽我所能理解您的要求,这在标准C++03中是不可能的。最密切相关的C++功能是预处理器宏参数的严格化,这将允许这样的事情:
#define ABC(X) do { remember_string_version(#X); abc X; } while (false)
ABC(("%d %d %d how are you",1,2,3));
请注意双括号-这些括号将字符串和数字分组,以便它们与ABC期望的单个参数“X”匹配
预处理器字符串化是唯一允许您将源代码的某些片段保留为字符串,同时仍将其用作源代码的功能….这取决于编译器,虽然理论上您可以这样做,但实际上它可能不可移植。正如@Tony所提到的,您可以在编译时通过宏执行,但对于运行时,请使用
va_arg
。它基本上实现了您想要的功能,是标准提供的一种工具,用于连接此编译器相关功能。由于C++17,您可以捕获所有参数,并将其转发到单个表达式(称为折叠表达式)中的stringstream:
#包括
#包括
#包括
#包括
标准::字符串abc(自动和头、自动和尾)
{
std::ostringstream out;
out-Hmm也许可以查看vsnprintf。我想有一个例子,比如你想在我链接的页面中做什么。@Lefteris我不想输出任何数据,我只是想完全存储它,因为我想在以后的阶段处理它。不清楚你在问什么,你是说你想以一个内容为%d%d%d您好”,1,2,3
?或者您想要一个字符串数组%d%d您好“
,“1”
,等等?这些事情在C++11之后都是可能的。我不确定OP是否想要保存源代码字符串,我相信OP想要“记住”“没有在运行时处理它们的参数。嗯,我认为这应该可以解决我的问题,因为我只需要获取整个字符串,然后在以后处理。谢谢你的回答,让我尝试一下,让它工作:)@Tony Delroy do{记住字符串版本(#X);abc X;}while(false)//如何使用这行代码code@hardyz009:当您调用ABC(…)
时,预处理器将替换do{memory\u string\u version((…);ABC(…);}而(false)
。您需要替换memory\u string\u version()
使用源代码字符串执行任何操作,并实现abc函数。您还没有告诉我们您真正想要实现的目标,因此很难提供更多建议……@littledv:“记住”没有在运行时处理它们的参数”-我甚至不能开始理解它!但是,不要说你错了-海报对语言来说显然是非常新的,可能需要任何东西。。。。
#define ABC(X) do { remember_string_version(#X); abc X; } while (false)
ABC(("%d %d %d how are you",1,2,3));
#include <string>
#include <sstream>
#include <iostream>
#include <functional>
std::string abc(auto&& head, auto&&... tail)
{
std::ostringstream out;
out << head;
((out << ',' << tail), ...);
return out.str();
}
int main()
{
std::string s = abc("%d %d %d how are you", 1, 2, 3);
std::cout << s << std::endl;
}
template<typename Head>
void capture(std::ostream& out, Head&& head)
{
out << std::forward<Head>(head);
}
template<typename Head, typename... Tail>
void capture(std::ostream& out, Head&& head, Tail&&... tail)
{
out << std::forward<Head>(head) << ',';
capture(out, std::forward<Tail>(tail)...);
}
template<typename... Args>
std::string abc(Args&&... args)
{
std::ostringstream out;
capture(out, std::forward<Args>(args)...);
return out.str();
}