gpt4 book ai didi

c++ - 如何创建一个使用字符串格式的给定变量文本的宏(或其他工具)?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:30:57 24 4
gpt4 key购买 nike

在尝试调查我的代码中的问题时,我喜欢调试打印:

cout << "foo:" << foo << "bar:" << bar << "baz:" << baz;

由于我经常编写这样的代码,所以如果我能使它通用且更易于键入,那就太棒了。也许是这样的:

DEBUG_MACRO(foo, bar, baz);

即使 foobarbaz 解析为变量名,而不是字符串,是否可以使用它们的变量名来创建字符串 "foo:""bar:""baz:"?你能编写一个函数或宏,它接受未指定数量的参数吗?

最佳答案

如果你有 C++11,你可以使用可变参数模板做一些类型安全且相当简洁的事情,例如:

#include <string>
#include <iostream>

template <typename T>
void debug(const T& v) {
std::cout << v << "\n";
}

template <typename T, typename... Tail>
void debug(const T& v, const Tail& ...args) {
std::cout << v << " ";
debug(args...);
}

#define NVP(x) #x":", (x)

int main() {
int foo=0;
double bar=0.1;
std::string f="str";
debug(NVP(foo),NVP(bar),NVP(f));
}

这里的 NVP 宏是完全可选的,只有当你想打印你在代码中引用它的名称时才需要。

如果你真的想跳过 NVP 位,你可以使用 Boost 预处理器库(或自己动手)例如:

#include <string>
#include <iostream>
#include <boost/preprocessor/seq/for_each_i.hpp>
#include <boost/preprocessor/punctuation/comma_if.hpp>

template <typename T>
void debug_impl(const T& v) {
std::cout << v << "\n";
}

template <typename T, typename... Tail>
void debug_impl(const T& v, const Tail& ...args) {
std::cout << v << " ";
debug_impl(args...);
}

#define NVP(x) #x":", (x)
#define MEMBER( r, data, i, elem ) BOOST_PP_COMMA_IF( i ) NVP(elem)

#define debug( members ) \
debug_impl( \
BOOST_PP_SEQ_FOR_EACH_I( MEMBER,, members ) \
)


int main() {
int foo=0;
double bar=0.1;
std::string f="str";
debug((foo)(bar)(f));
}

以一些稍微奇怪的语法为代价。我的示例基于 this answer .我尝试使用可变参数宏作为“纯”C++11 解决方案直接解决此问题,但事实证明,通过列表递归比您希望的要棘手。

关于c++ - 如何创建一个使用字符串格式的给定变量文本的宏(或其他工具)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10899908/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com