Nik*_*arg 3 c++ debugging macros variadic-functions
是否有可能编写一个宏,它可以接受可变数量的参数并像这样扩展:
quickdebug(a) -> cout << #a ": " << a;
quickdebug(a,b) -> cout << #a ": " << a << #b ": "<< b;
Run Code Online (Sandbox Code Playgroud)
等等
如果没有,我是否有可能至少打印所有参数而不给出格式字符串.例如
quickdebug2(a) -> cout << a ;
quickdebug2(a,b) -> cout << a << " " << b ;
Run Code Online (Sandbox Code Playgroud)
等等
例如在java中,我可以编写一个函数,它提供了类似的功能:
void debug(Object...args)
{
System.out.println(Arrays.deepToString(args));
}
Run Code Online (Sandbox Code Playgroud)
通过使用覆盖的类,运算符:
class VariadicToOutputStream
{
public:
VariadicToOutputStream(std::ostream& s, const std::string& separator = " ") : m_stream(s), m_hasEntries(false), m_separator(separator) {}
template<typename ObjectType>
VariadicToOutputStream& operator , (const ObjectType& v)
{
if (m_hasEntries) m_stream << m_separator;
m_stream << v;
m_hasEntries=true;
return *this;
}
~VariadicToOutputStream()
{
m_stream << std::endl;
}
private:
std::ostream& m_stream;
bool m_hasEntries;
std::string m_separator;
};
Run Code Online (Sandbox Code Playgroud)
你可以写例如:
VariadicToOutputStream(std::cout) , 1, 0.5f, "a string";
Run Code Online (Sandbox Code Playgroud)
然后可以使用预处理器宏包装它:
#define VARIADIC_TO_STDOUT(...) VariadicToOutputStream(std::cout),__VA_ARGS__;
Run Code Online (Sandbox Code Playgroud)
所以你可以写:
VARIADIC_TO_STDOUT(1, 0.5f, "a string");
Run Code Online (Sandbox Code Playgroud)
在参数之间添加fi分隔符字符串会很容易.
编辑:我刚刚添加了一个默认空格作为分隔符字符串.