Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使varargs异常构造函数填充stringstream_C++_Templates_Stringstream - Fatal编程技术网

C++ 使varargs异常构造函数填充stringstream

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

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

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的。更新的。