我不喜欢被限制在特定数量的参数上。我没有找到一个好的方法来静态解码名称,所以这些名称将被组合为逗号分隔的字符串,然后在运行时进行解码。总体而言,这可能有些过于繁重,但至少它按要求执行并且没有参数数量的限制(除了编译器的限制):
#include <iostream>
#include <sstream>
#include <iterator>
#include <algorithm>
#include <tuple>
#include <vector>
#include <type_traits>
#include <stdlib.h>
template <int I, int S, typename... V>
typename std::enable_if<I == S>::type
debug_var(std::vector<std::string> const&, std::tuple<V...> const&)
{
}
template <int I, int S, typename... V>
typename std::enable_if<I != S>::type
debug_var(std::vector<std::string> const& n, std::tuple<V...> const& v)
{
std::cout << n[I] << '=' << std::get<I>(v) << ' ';
debug_var<I + 1, S>(n, v);
}
template <typename... V>
void debug(std::vector<std::string> const& n, std::tuple<V...> const& v)
{
debug_var<0, sizeof...(V)>(n, v);
std::cout << '\n' << std::flush;
}
std::vector<std::string> debug_names(char const* names)
{
std::vector<std::string> result;
std::istringstream in(names);
for (std::string name; std::getline(in >> std::ws, name, ','); ) {
result.push_back(name);
}
return result;
}
#define DEBUG(...) debug(debug_names(#__VA_ARGS__), std::tie(__VA_ARGS__));
int main()
{
int a=1, b=2;
DEBUG(a, b);
DEBUG();
}
这段代码使用了2011年C++修订版引入的多个功能特性。
endl
,可能通过使用预处理器来连接字符串减少调用operator<<
的次数...)。 - David Rodríguez - dribeas#define DBUG1(...) DBUG(arg1);DBUG(arg2);...;DBUG(argk);
? - user2833292