使用不带格式字符串的可变参数调试C++宏

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)

Rob*_*ert 6

通过使用覆盖的类,运算符:

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分隔符字符串会很容易.

编辑:我刚刚添加了一个默认空格作为分隔符字符串.