1
根据用户的选择,我必须从数据库中导出数据,数据库为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();
}
是的,这是一种可能性,但真的没有办法根据另一个变量的值声明一个声明吗? –
@ThibautB。您不能根据运行时已知的变量来选择类型,因为该类型是在编译时推导出来的。你可以写一个封装你的流的类;我编辑了我的答案以添加示例。 – piwi
你可以结合两个:有一个'template struct stream_impl:stream_base ...' –
Caleth