Nik*_*arg 3 c++ debugging macros variadic-functions
是否有可能编写一个宏,它可以接受可变数量的参数并像这样扩展:
quickdebug(a)   ->  cout << #a ": " << a;
quickdebug(a,b) ->  cout << #a ": " << a << #b ": "<< b;
等等
如果没有,我是否有可能至少打印所有参数而不给出格式字符串.例如
quickdebug2(a)   -> cout << a ;
quickdebug2(a,b) -> cout << a << " " << b ;
等等
例如在java中,我可以编写一个函数,它提供了类似的功能:
void debug(Object...args) 
{
  System.out.println(Arrays.deepToString(args));
}
通过使用覆盖的类,运算符:
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;
};
你可以写例如:
VariadicToOutputStream(std::cout) , 1, 0.5f, "a string";
然后可以使用预处理器宏包装它:
#define VARIADIC_TO_STDOUT(...)     VariadicToOutputStream(std::cout),__VA_ARGS__;
所以你可以写:
VARIADIC_TO_STDOUT(1, 0.5f, "a string");
在参数之间添加fi分隔符字符串会很容易.
编辑:我刚刚添加了一个默认空格作为分隔符字符串.
| 归档时间: | 
 | 
| 查看次数: | 1658 次 | 
| 最近记录: |