我熟悉 va_arg 列表。我想知道有没有一种方法可以在逗号后获取值
例如
abc("%d %d %d how are you",1,2,3);
我想知道是否可以将整个调用传递给一个字符串而不进行任何处理
string [1]="%d %d %d how are you",1,2,3;
我不想做任何处理,我只想读取整个调用并将其存储在一串数组中。
我熟悉 va_arg 列表。我想知道有没有一种方法可以在逗号后获取值
例如
abc("%d %d %d how are you",1,2,3);
我想知道是否可以将整个调用传递给一个字符串而不进行任何处理
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 开始,您可以捕获所有参数并将它们转发到单个表达式中的字符串流(称为fold-expression):
#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;
}
在 C++17 之前,但从 C++11 开始,您可以使用递归模板(或 void 大括号列表 hack,我不会在这里介绍)。片段:
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();
}