通用地打印一系列变量及其名称
Generically print a sequence of variables with their names
我想:
int a = 2;
int b = 3;
// ...
PRINT1(a, b, ...);
PRINT2(a, b, ...);
其中PRINT1
应扩展为:
std::cout << "a = " << a << ", b = " << b << ... << std::endl;
// note: in "a = ...", "a" is the name of the variable, i.e.:
// PRINT(bar, ...) should print "bar = ..."
并且PRINT2
应该扩展到(使用cppformat):
fmt::print("a = {}, b = {}, ...", a, b, ...);
现在我正在使用Boost.PP,必须编写PRINT((a)(b)(c)...)
才能实现与第一个场景类似的功能,但如果我可以只使用逗号会更好。其中一个问题的解决方案可能很容易适用于同时解决这两个问题。
您可以使用BOOST_PP_TUPLE_TO_SEQ
将其转换为序列,如下所示:
#define PRINT_ARGS(...) PRINT(BOOST_PP_TUPLE_TO_SEQ((__VA_ARGS__)))
这是我的解决方案。不是很动态,你必须事先知道你会有多少争论:
// Using macros:
#define PRINT1_1(A) std::cout << "a = " << A << std::endl;
#define PRINT1_2(A,B) std::cout << "a = " << A << ", b = " << B << std::endl;
#define PRINT2_1(A) fmt::print("a = {}", A);
#define PRINT2_2(A,B) fmt::print("a = {}, b = {}", A, B);
// Using `va_arg`:
#include <iostream>
#include <cstdarg>
void PRINT1(int argc, ...)
{
va_list args;
va_start(args, argc);
char vc = 'a';
int val = argc;
for (int i = 0; i < argc; ++i, ++vc) {
std::cout << vc << " = " << va_arg(args, int);
if (i < argc - 1)
std::cout << ", ";
}
va_end(args);
std::cout << std::endl;
}
// similarly implement PRINT2
int main()
{
PRINT1_2(1,2);
// first argument specifies the number
// of the remaining arguments:
PRINT1(3, 1,2,4);
return 0;
}
输出:
a = 1, b = 2
a = 1, b = 2, c = 4
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 将数组的地址分配给变量并删除
- 为"adjacent"变量赋值时出现问题
- enum是C++中的宏变量还是整数变量
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 用C++中的一个变量定义一个常量
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 你能重载对象变量名本身返回的内容吗
- 内置函数可查看CPP中的成员变量
- 是否可以初始化不可复制类型的成员变量(或基类)
- 尝试通过多个向量访问变量时,向量下标超出范围
- 试图让变量检查数组中的某些内容
- Cpp-Tuple使用带有变量的get
- 函数获取参数的变量列表并将它们转换为一系列字节?
- 如何访问一系列const变量作为const数组
- 对需要变量传递的对象使用一系列指针
- 将一系列指针分配给C 中的私人变量
- 通用地打印一系列变量及其名称
- 通过一系列成员变量调用运算符