枚举标志的使用位集的优缺点是什么?
namespace Flag {
enum State {
Read = 1 << 0,
Write = 1 << 1,
Binary = 1 << 2,
};
}
namespace Plain {
enum State {
Read,
Write,
Binary,
Count
};
}
int main()
{
{
unsigned int state = Flag::Read | Flag::Binary;
std::cout << state << std::endl;
state |= Flag::Write;
state &= ~(Flag::Read | Flag::Binary);
std::cout << state << std::endl;
} {
std::bitset<Plain::Count> state;
state.set(Plain::Read);
state.set(Plain::Binary);
std::cout << state.to_ulong() << std::endl;
state.flip();
std::cout << state.to_ulong() …Run Code Online (Sandbox Code Playgroud) 我用QStrings来存储密码.如果更准确,我使用QStrings从GUI获取密码.关键是在密码使用/设备之后我需要QString用密码使内部s数据字节无效(零)以完全从内存中消除它.
这是我的调查:
QString破坏它的数据保留在内存中nonzeroed;QString以使用零来实现它时,它会触发写时复制习惯用法并为修改后的数据变量分配新内存.旧数据保持不变.即使我使用QString::data()方法也是如此.不太确定为什么 - 可能是因为它不是原始的char *但是QChar *;QString::clear(),= ""实际上与上述COW相同.问:如何实施正确的QString清理以防止密码泄露?
我有一个QAbstractTableModel基于简单的模型和一个QTableView。
我的目标也很简单:允许通过拖放移动/重新排序行。笔记:
QTableView应该反映在我的模型中;我真的很接近我的目标。但它仍然没有像我预期的那样工作。现在我可以拖动行,但似乎任何单元格都可以接受拖放,尽管我Qt::ItemIsDropEnabled只为全局表的父级指定了此标志,并且没有为实际表项指定此标志,因为我不想拖放到它们,我想以某种方式删除“行之间”,只是为了执行行移动。因为表格项目出于某种原因可以接受删除,所以我得到了奇怪的行为:如果删除到任何行的第一个单元格,我就完全实现了我想要的:我的行移动正确。但是如果我掉到任何行的非第一个单元格,它就会完全错误。但最好展示一下这里发生的事情的图片:
我的代码(正是我的问题的最小样本):
主程序
void setupView(QTableView &t)
{
t.verticalHeader()->hide();
t.horizontalHeader()->hide();
t.horizontalHeader()->setStretchLastSection(true);
t.setSelectionBehavior(QAbstractItemView::SelectRows);
t.setSelectionMode(QAbstractItemView::SingleSelection);
t.setDragEnabled(true);
t.setDropIndicatorShown(true);
t.setAcceptDrops(true);
t.viewport()->setAcceptDrops(true);
t.setDefaultDropAction(Qt::MoveAction);
t.setDragDropMode(QTableView::InternalMove);
t.setDragDropOverwriteMode(false);
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QMainWindow w;
QTableView *table = new QTableView(&w);
setupView(*table);
table->setModel(new TableModel);
w.setCentralWidget(table);
w.show();
return a.exec();
}
Run Code Online (Sandbox Code Playgroud)
表模型.cpp
#include "tablemodel.h" …Run Code Online (Sandbox Code Playgroud) 我已经在Stack Overflow中阅读了很多关于严格别名的QA,但它们都很常见,而且讨论总是倾向于引用C++标准的深层细节,这些细节几乎总是很难理解.特别是在标准时,不要直接说话,而是用泥泞不清楚的方式描述.所以,我的问题可能是这里有大量质量保证的重复,但是,请回答一个具体的问题:
这是做"nonalias_cast"的正确方法吗?:
template<class OUT, class IN>
inline auto nonalias_cast(IN *data) {
char *tmp = reinterpret_cast<char *>(data);
return reinterpret_cast<OUT>(tmp);
}
float f = 3.14;
unsigned *u = nonalias_cast<unsigned *>(&f);
*u = 0x3f800000;
// now f should be equal 1.0
Run Code Online (Sandbox Code Playgroud)
我猜答案是否定的.但是有什么好的解决方法吗?当然,除了禁用严格别名标志.联盟也不是一个方便的选择,除非有一种方法在nonalias_cast函数体内部适合联合黑客.memcpy这里也不是一个选项 - 数据更改应该是同步的.
一个不可能的梦想或一个难以捉摸的现实?
UPD:
好的,既然我们得到了一个否定答案"是否可能?" 问题,我想问你一个困扰我的额外问题:
将如何您解决这个任务?我的意思是有很多实际的任务,更多的是要求"玩一点点"的方法.例如,假设您必须像这样编写IEEE-754浮点转换器.我更关注问题的实际方面:如何有一个解决方法来实现目标?至少在"#$ $的痛苦"方式.
我有一个Qt应用程序.它有一个.pro文件TEMPLATE = app.项目的子文件夹之一是另一个Qt项目的git-submodule:一个库的集合,它有自己的.pro文件TEMPLATE = subdirs.
图形上看起来像:
project/
app.pro (TEMPLATE = app)
stuff/
libs/ <-- git-submodule
libs.pro (TEMPLATE = subdirs)
lib1/
lib1.pro (TEMPLATE = lib)
lib2/
lib2.pro (TEMPLATE = lib)
Run Code Online (Sandbox Code Playgroud)
libs作为一个独立的项目编译好并生成.lib文件.但在这种情况下,我想以某种方式包括libs.pro到project一个子目录,虽然app.pro的TEMPLATE不是subdirs,但app.也许这就是为什么我尝试写东西喜欢SUBDIRS += askelib到app.pro没有效果.总而言之,我的目标是获取.libbuild文件夹中的文件app.pro.我强调这libs是一个git-submodule,因为在libs项目内部不应该改变任何东西来实现我的目标.
我知道,如果我改变也许应该努力app.pro的TEMPLATE来subdirs.但这不是我真正想做的事情,因为它会使事情变得更加困难,因为项目层次结构将会达到另一个嵌套级别:
subdirs_proj/
app/
libs/
Run Code Online (Sandbox Code Playgroud)
代替
app/
libs/ …Run Code Online (Sandbox Code Playgroud) 我们通常这样在Qt中设置视图的模型:
view->setModel(model);
但是,有什么方法可以从视图中删除模型吗?我的意思是说,将视图保留为空,就像刚刚创建的那样,并且尚未设置任何模型。
如果您问我一个求婚的理由,那么我的情况与这个人的帖子非常相似。当第一个视图没有选择或者它是空的/无效的/什么的时候,我想让第二个视图从字面上什么都没有显示:没有标题,列,垃圾数据。在这种情况下,从视图中删除模型似乎非常合理。
我尝试了一个肮脏的技巧:
*view = QTableView();
但是Qt照顾了这些邪恶的东西,并将其operator=私有化。
让我们考虑一些人为的C++代码:
int i = 0;
try { someAction(); }
catch(SomeException &e) { i = -1; }
i = 1;
... // code that uses i
Run Code Online (Sandbox Code Playgroud)
我想这个代码分配-1到i的情况下someAction()抛出异常并分配1的情况下,如果没有例外.正如你现在所看到的,这段代码是错误的,因为i最终总是成为1.当然,我们可以做一些技巧解决方法,如:
int i = 0;
bool throwed = false;
try { someAction(); }
catch(SomeException &e) { throwed = true; }
i = throwed ? -1 : 1;
... // code that uses i
Run Code Online (Sandbox Code Playgroud)
我的问题是:C++中是否存在类似"成功尝试分支"的内容,如果在try块中没有任何抛出,我会做一些操作?就像是:
int i = 0;
try { someAction(); }
catch(SomeException …Run Code Online (Sandbox Code Playgroud)