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

Declare a variable type depending on a ternary expression

我必须根据用户的选择从 XMLCSV 中的数据库导出数据。
我库存的选择是这样的:

const bool isXml = (cbxFormat->currentIndex() == 1 ? true : false);

为了写入导出文件,我使用 QXmlStreamWriterQTextStream
我想避免使用 if/else 语句来声明我的流。
我尝试像这样使用 decltype

decltype( (isXml ? QXmlStreamWriter() : QTextStream()) ) stream;

但我不能,因为 QXmlStreamWriterQTextStream 没有相同的基数 class 并且在基数 class 相同的情况下,类型stream 的是 "widest" 类型。

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

std::conditional<isXml, QXmlStreamWriter, QTextStream>::type stream;

是否存在可行的解决方案?

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();
}

您可以编写一个将类型作为模板参数的函数,并使用 if:

以适当的类型调用该函数
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);
  }
}

编辑:

另一个解决方案是将您的流包装在 类:

struct stream_base {
  virtual void work(QFile&) = 0;
};
struct xml_stream: stream_base {
  virtual void work(QFile&) { QXmlStreamWriter stream; ... }
};
struct text_stream: stream_base {
  virtual void work(QFile&) { QTextStream stream; ... }
};
std::unique_ptr<stream_base> make_stream(bool isXml) {
  return isXml ? std::make_unique<xml_stream>() : std::make_unique<text_stream> ();
}

void work () {
  QFile file (file_name);
  // ...
  auto stream = make_stream(isXml);
  stream->work(file);
}