小编Scu*_*der的帖子

是否可以确定枚举是否是强类型的?

C++ 11为我们如何处理枚举引入了两个不同的补充:一个使它们成为范围的选项,以及一个使它们键入的选项.所以现在我们有四种不同的枚举子类型:

enum Old {};
enum Typed : int8_t {};
enum class Scoped {};
enum class TypedScoped : int8_t {};
Run Code Online (Sandbox Code Playgroud)

这个问题询问如何确定枚举是否作用域.我想知道如何确定是否键入枚举.


附加信息

我使用Qt框架,它提供了QDataStream以便携式跨平台方式序列化/反序列化数据的类.显然,为了使结果数据流可移植,您必须以固定长度的形式存储所有整数.这也包括枚举.回到当天,我制作了几个辅助宏来定义枚举的序列化/反序列化,方法是将它们转换为具有固定(用户指定)长度的整数:

#define SC_DECLARE_DATASTREAM_WRITE_OPERATOR(_TYPE) \
    QDataStream &operator<<(QDataStream &stream, _TYPE v);

#define SC_DECLARE_DATASTREAM_READ_OPERATOR(_TYPE) \
    QDataStream &operator>>(QDataStream &stream, _TYPE &v);

#define SC_DECLARE_DATASTREAM_OPERATORS(_TYPE) \
    SC_DECLARE_DATASTREAM_WRITE_OPERATOR(_TYPE) \
    SC_DECLARE_DATASTREAM_READ_OPERATOR(_TYPE)

#define SC_DEFINE_DATASTREAM_ENUM_WRITE_OPERATOR(_TYPE, _LEN) \
    QDataStream &operator<<(QDataStream &stream, _TYPE v) \
{ \
    qint ## _LEN t = v; \
    static_assert(sizeof(t) >= sizeof(v), "Increase length"); \
    stream << t; \
    return …
Run Code Online (Sandbox Code Playgroud)

c++ enums type-traits c++11

8
推荐指数
1
解决办法
246
查看次数

WINE和Windows命名管道

这是我的问题:我有一个闭源的第三方Win32应用程序,它通过命名管道充当其他程序的服务器,即它希望它的客户端像这样做:

HANDLE h = CreateFile("\\\\.\\pipe\\$pipe_name$", GENERIC_READ | GENERIC_WRITE, etc...);
// ...
TransactNamedPipe(h, buf, etc...);
// ...
CloseHandle(h);
Run Code Online (Sandbox Code Playgroud)

此应用程序在WINE中运行完美,除了我无法与之通信.所以这是我的问题:

当要求打开烟斗时,WINE究竟做了什么?比方说,它是否将它映射到〜/ .wine /或其中的某个FIFO文件?有没有办法从Linux应用程序与这样的程序进行通信?谷歌对此一无所知.

谢谢.

wine named-pipes

7
推荐指数
1
解决办法
2031
查看次数

Qt资源国际化失败

以下是Qt文档的引用:

某些资源需要根据用户的语言环境进行更改,例如翻译文件或图标.这是通过向qresource标记添加lang属性,指定合适的区域设置字符串来完成的.例如:

<qresource>
    <file>cut.jpg</file>
</qresource>
<qresource lang="fr">
    <file alias="cut.jpg">cut_fr.jpg</file>
</qresource>
Run Code Online (Sandbox Code Playgroud)

如果用户的语言环境是法语(即QLocale :: system().name()返回"fr_FR"),则:/ cut.jpg将成为对cut_fr.jpg图像的引用.对于其他语言环境,使用cut.jpg.

我试着这样做但我失败了.这是我的*.qrc文件的一部分:

<qresource>
    <file>HtmlTemplates/angle.html</file>
    <file>HtmlTemplates/bottom.html</file>
    <file>HtmlTemplates/top.html</file>
</qresource>
<qresource lang="en">
    <file alias="HtmlTemplates/angle.html">HtmlTemplates/en/angle.html</file>
    <file alias="HtmlTemplates/bottom.html">HtmlTemplates/en/bottom.html</file>
    <file alias="HtmlTemplates/top.html">HtmlTemplates/en/top.html</file>
</qresource>
Run Code Online (Sandbox Code Playgroud)

如您所见,它遵循与手册中的示例完全相同的模式.但是,尝试编译此文件会产生以下结果:

..\Blinky_2.0\resources.qrc: Warning: potential duplicate alias detected: 'angle.html'
..\Blinky_2.0\resources.qrc: Warning: potential duplicate alias detected: 'bottom.html'
..\Blinky_2.0\resources.qrc: Warning: potential duplicate alias detected: 'top.html'
Run Code Online (Sandbox Code Playgroud)

如果我尝试修改QtCreator中的*.qrc文件,它会将其重置为错误状态,删除lang属性:

<qresource prefix="/">
    <file>HtmlTemplates/angle.html</file>
    <file>HtmlTemplates/bottom.html</file>
    <file>HtmlTemplates/top.html</file>
    <file alias="HtmlTemplates/angle.html">HtmlTemplates/en/angle.html</file>
    <file alias="HtmlTemplates/bottom.html">HtmlTemplates/en/bottom.html</file>
    <file alias="HtmlTemplates/top.html">HtmlTemplates/en/top.html</file>
</qresource>
Run Code Online (Sandbox Code Playgroud)

所以我被迫在我的代码中迭代不同语言环境的资源.我错过了什么或这是一个Qt错误?Qt版本是4.8.4,QtCreator版本是2.8.1.

c++ qt qt4 embedded-resource rcc

6
推荐指数
1
解决办法
902
查看次数

Qt:处理后台线程处理程序抛出的异常

我知道您需要重新实现 QApplication::notify() 方法才能正确捕获从主线程的事件处理程序抛出的异常。但是其他线程呢?假设我有一个带有槽的对象,并且该对象位于 QThread 中(具有默认的 run() 方法,该方法仅调用 exec()),即该对象的线程关联性是后台 QThread。那么,我应该在哪里捕获从该对象的槽抛出的异常呢?

IOW,如何重新实现后台线程的notify()方法?

c++ qt multithreading exception qt4

5
推荐指数
1
解决办法
3249
查看次数

反编译 1990 DOS 应用程序

我有一些重要的数据,是几十年前由一个古老的 16 位 DOS 应用程序编写的。没有文档,没有来源,也没有关于作者的信息。只是 16 位 exe。我想我是时候学习如何反编译东西了,因为这似乎是恢复文件格式的唯一方法。我尝试过 OllyDbg,它看起来确实很棒,但它不能 16 位。

那么,是否有反汇编器/调试器能够处理此类可执行文件?谢谢。

UPD:我知道 DOSbox,应用程序可以在其中运行。问题是,我不需要运行它,我需要了解它写入数据的文件格式。或者也许我对 DOSbox 不了解,它也可以作为调试器/反编译器运行?或者你的意思是在 DOSbox 中启动一些旧的 16 位 DOS 调试器/反编译器?后者听起来像是一个想法,但是您能说出一个像样的 DOS 调试器吗?

debugging decompiling disassembly decompiler

3
推荐指数
1
解决办法
1万
查看次数

如何将引用类型转换为值类型?

我正在尝试使用new decltype关键字将一些代码移动到模板,但是当与解除引用的指针一起使用时,它会生成引用类型.SSCCE:

#include <iostream>

int main() {
    int a = 42;
    int *p = &a;
    std::cout << std::numeric_limits<decltype(a)>::max() << '\n';
    std::cout << std::numeric_limits<decltype(*p)>::max() << '\n';
}
Run Code Online (Sandbox Code Playgroud)

第一个numeric_limits工作,但第二个抛出value-initialization of reference type 'int&'编译错误.如何从指向该类型的指针获取值类型?

c++ reference decltype c++11

3
推荐指数
3
解决办法
2101
查看次数

Qt元对象系统:使用带有名称的字符串发出信号

Qt信号/插槽系统摇摇欲坠,但看起来它缺少一些真正有用的功能(或者至少我找不到如何使用它)。我有一个带有很多信号的类,而这个类的类switch需要根据变量的值发出适当的信号。现在,我使用C预处理器解决此问题:

#define CASE(_NAME) \    
case MyEnum_ ## _NAME: \
{ \
    emit MySignal_ ## _NAME(); \
    do_other_stuff(); \
    break; \
}

switch(val)
{
CASE(Val_1)
CASE(Val_2)
CASE(Val_3)
}
Run Code Online (Sandbox Code Playgroud)

这看起来不正确。我敢肯定有一种更优雅的方法。QMetaObject有一种indexOfSignal方法,可以使用带有名称的字符串为我提供信号的Qt内部ID。如果我可以使用该ID发出信号,我的代码将变得更加清晰。

我已经窥视了由生成的信号方法实现moc,看起来唯一一个与另一个信号不同的是一位数字:

void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) };
QMetaObject::activate(this, &staticMetaObject, <signal_id>, _a);
Run Code Online (Sandbox Code Playgroud)

其中<signal_id>,每个信号的唯一整数。

所以,问题是,我该怎么办emit(int signalIdx)?还是至少有机会致电QMetaObject::activate,因为它看上去埋在专用标头中?

c++ qt qt-signals qmetaobject

1
推荐指数
1
解决办法
1888
查看次数