Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.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++ 根据三元表达式声明变量类型_C++_Qt_Qt5_Variable Declaration - Fatal编程技术网

C++ 根据三元表达式声明变量类型

C++ 根据三元表达式声明变量类型,c++,qt,qt5,variable-declaration,C++,Qt,Qt5,Variable Declaration,根据用户的选择,我必须以XML或CSV格式从数据库导出数据。 我的选择如下: const bool isXml = (cbxFormat->currentIndex() == 1 ? true : false); 为了编写导出文件,我使用了QXmlStreamWriter或QTextStream 我想避免使用if/else语句来声明我的流。 我尝试使用decltype如下: decltype( (isXml ? QXmlStreamWriter() : QTextStream()) )

根据用户的选择,我必须以
XML
CSV
格式从数据库导出数据。
我的选择如下:

const bool isXml = (cbxFormat->currentIndex() == 1 ? true : false);
为了编写导出文件,我使用了
QXmlStreamWriter
QTextStream

我想避免使用
if/else
语句来声明我的流。
我尝试使用
decltype
如下:

decltype( (isXml ? QXmlStreamWriter() : QTextStream()) ) stream;
但是我不能,因为
QXmlStreamWriter
QTextStream
没有相同的基类,并且在基类相同的情况下,
stream
的类型是“最宽”的类型

我还尝试使用
std::conditional
,但我不能,因为isXml在运行时是已知的:

std::conditional<isXml, QXmlStreamWriter, QTextStream>::type stream;
std::conditional::type流;
有没有可能的解决办法

QFile expFile(fileName);
if (expFile.open(QIODevice::WriteOnly)) {
    /* not possible */
    // decltype( (isXml ? QXmlStreamWriter() : QTextStream()) ) stream;
    /* isXml is known at runtime */
    // std::conditional<isXml, QXmlStreamWriter, QTextStream>::type stream(&expFile);
    // If not possible... if/else

    // filling my stream..

    expFile.close();
}
QFile expFile(文件名);
if(expFile.open(QIODevice::WriteOnly)){
/*不可能*/
//decltype((isXml?QXmlStreamWriter():QTextStream())流;
/*isXml在运行时是已知的*/
//std::conditional::type流(&expFile);
//如果不可能…如果/否则
//填满我的小溪。。
expFile.close();
}

您可以编写一个类型为模板参数的函数,并在以下情况下使用
调用相应类型的函数:

template <typename StreamT>
void do_work(QFile& file) {
    StreamT stream;
    // ...
    stream << strData;
}

void work() {
  QFile file(file_name);
  // ...
  if (isXml) {
    do_work<QXmlStreamWriter>(file);
  } else {
    do_work<QTextStream>(file);
  }
}
模板
无效工作(QFile&file){
溪流;
// ...
流水作业(档案);
}

您可以编写一个类型为模板参数的函数,并在以下情况下使用
调用相应类型的函数:

template <typename StreamT>
void do_work(QFile& file) {
    StreamT stream;
    // ...
    stream << strData;
}

void work() {
  QFile file(file_name);
  // ...
  if (isXml) {
    do_work<QXmlStreamWriter>(file);
  } else {
    do_work<QTextStream>(file);
  }
}
模板
无效工作(QFile&file){
溪流;
// ...
流水作业(档案);
}

是的,这是可能的,但实际上没有办法根据另一个变量的值进行声明?@ThibautB。不能基于运行时已知的变量选择类型,因为该类型是在编译时推导的。您可以编写一个类来包装您的流;我已经编辑了我的答案以添加一个示例。您可以将两者结合起来:使用
模板stream\u impl:stream\u base…
@piwi。感谢您的确认是的,这是可能的,但实际上没有办法根据另一个变量的值进行声明?@ThibautB。不能基于运行时已知的变量选择类型,因为该类型是在编译时推导的。您可以编写一个类来包装您的流;我已经编辑了我的答案以添加一个示例。您可以将两者结合起来:使用
模板stream\u impl:stream\u base…
@piwi。谢谢你的确认