异常构造函数来填充字符串流

Make varargs Exception constructor to fill stringstream

本文关键字:字符串 填充 构造函数 异常      更新时间:2023-10-16

基本上我正在制作Exception类,我希望能够轻松地传递调试细节,例如:

var error = someFunction();
if(error!=0) {
    throw MyException("someFunction ended with error state #",error,'.');
}

这将要求MyException类接受可由stringstream处理的变量参数。我不知道该怎么做,我的想象是这样的:

#include <string>
#include <sstream>
template /* MUCH DEEP MAGIC HERE**/
MyException::MyException(/* MOAR DEEP MAGIC!!! **/) {
    std::stringstream ss;
    for(/** ITERATE THROUGH MORE MAGIC**/) {
        ss<</**FETCH MAGIC STUFF**/;
    }
    this->message = ss.str();
}

在展开参数包时可以滥用逗号操作符来执行此操作。这就是魔力。

template<typename Stream, typename ...Args>
Stream& print(Stream& o, const Args&... args)
{
    auto x = { ((o << args), 0)... };
    return o;
}

每次一个将所有参数发送到流,同时接受逗号后面的表达式的结果,构造一个整数初始化列表。