C++ 使varargs异常构造函数填充stringstream
基本上,我正在创建Exception类,我希望能够轻松地传递调试细节,例如:C++ 使varargs异常构造函数填充stringstream,c++,templates,stringstream,C++,Templates,Stringstream,基本上,我正在创建Exception类,我希望能够轻松地传递调试细节,例如: var error = someFunction(); if(error!=0) { throw MyException("someFunction ended with error state #",error,'.'); } 这需要MyException类接受可以由stringstream处理的varargs参数。我不知道我该怎么做,我想象的是: #include <string> #incl
var error = someFunction();
if(error!=0) {
throw MyException("someFunction ended with error state #",error,'.');
}
这需要MyException
类接受可以由stringstream
处理的varargs参数。我不知道我该怎么做,我想象的是:
#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();
}
#包括
#包括
模板/*这里有很多深层魔法**/
MyException::MyException(/*MOAR DEEP MAGIC!!!***/){
std::stringstream-ss;
对于(/**迭代更多魔法**/){
扩展参数包时,可以滥用逗号运算符来执行此操作。这就是神奇之处
template<typename Stream, typename ...Args>
Stream& print(Stream& o, const Args&... args)
{
auto x = { ((o << args), 0)... };
return o;
}
模板
流和打印(流和o、常量参数和…参数)
{
auto x={((哦,电话糟透了。无法编辑。这确实应该使用o
和返回类型的通用引用。进一步解释auto x
行:x
是std::initializer\u list
。括号内的初始值设定项列表是扩展参数包所允许的上下文;表达式{(foo args bar).}
计算结果为{(foo arg1 bar),(foo arg2 bar),(foo arg3 bar)}
。这在这里很有用,因为可以保证初始值设定项列表中的项是从左到右求值的,因此这些项将按正确的顺序发送到o
。需要,0
将表达式的类型从istream&
转换为int
,因为初始值设定项列表不能包含引用。见鬼谢谢你的回答,它看起来比我想象的要容易。但是我不知道如何在页眉中声明构造函数…所以,不管我怎么尝试,我都会在C++类头文件中使用模板出错:即使在我使用内联方法声明时也会发生这种错误。你使用什么编译器?这个解决方案是C++ 11的。更新的。