我必须根据用户的选择以 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;
是否存在可行的解决方案?
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);
}
关于c++ - 根据三元表达式声明变量类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43919073/