制作可变参数异常构造函数以填充字符串流
Make varargs Exception constructor to fill stringstream
基本上我正在制造异常 class 并且我希望能够轻松传递调试详细信息,例如:
var error = someFunction();
if(error!=0) {
throw MyException("someFunction ended with error state #",error,'.');
}
这将要求 MyException
class 接受可以由 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;
}
这会将所有参数一次一个地发送到流,同时在逗号后获取表达式的结果,从而构造一个整数初始化列表。
基本上我正在制造异常 class 并且我希望能够轻松传递调试详细信息,例如:
var error = someFunction();
if(error!=0) {
throw MyException("someFunction ended with error state #",error,'.');
}
这将要求 MyException
class 接受可以由 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;
}
这会将所有参数一次一个地发送到流,同时在逗号后获取表达式的结果,从而构造一个整数初始化列表。