根据三元表达式声明变量类型
Declare a variable type depending on a ternary expression
我必须根据用户的选择从 XML
或 CSV
中的数据库导出数据。
我库存的选择是这样的:
const bool isXml = (cbxFormat->currentIndex() == 1 ? true : false);
为了写入导出文件,我使用 QXmlStreamWriter
或 QTextStream
。
我想避免使用 if/else
语句来声明我的流。
我尝试像这样使用 decltype
:
decltype( (isXml ? QXmlStreamWriter() : QTextStream()) ) stream;
但我不能,因为 QXmlStreamWriter
和 QTextStream
没有相同的基数 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);
}
我必须根据用户的选择从 XML
或 CSV
中的数据库导出数据。
我库存的选择是这样的:
const bool isXml = (cbxFormat->currentIndex() == 1 ? true : false);
为了写入导出文件,我使用 QXmlStreamWriter
或 QTextStream
。
我想避免使用 if/else
语句来声明我的流。
我尝试像这样使用 decltype
:
decltype( (isXml ? QXmlStreamWriter() : QTextStream()) ) stream;
但我不能,因为 QXmlStreamWriter
和 QTextStream
没有相同的基数 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);
}