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。谢谢你的确认