小编Pau*_*ich的帖子

无法在typeid中使用declval用于TDM-GCC

编译器:TDM-GCC-5.1.0(SJLJ展开)

我一直在玩declval,我注意到我无法在它应该工作的环境中使用它:作为参数typeid().

在下面的代码中,我将其declval用于其中一个主要用例:获取方法的返回类型而不通过实例.我得到的错误是static_assert消息declval,但这应该是不可能的,因为typeid()在这种情况下不评估它的参数:

#include <typeinfo>
#include <utility>

struct Foo
{
    int func();
};

int main()
{
    typeid(std::declval<Foo>().func());
}
Run Code Online (Sandbox Code Playgroud)

这不能为我编译(编译时-std=c++14).我唯一的猜测是,我发现了一个编译器错误,或者我做了一些明显错误的事情,我看不到它.如果是后者,我道歉.

编辑:感谢ildjarn帮助我,解决方案是使用decltype,所以最后一行代码变为:

typeid(decltype(std::declval<Foo>().func()));
Run Code Online (Sandbox Code Playgroud)

这很好用.但是,现在我的问题变成了:怎么样?这两个typeid()decltype()是未评估的背景,所以我不知道有什么区别.

c++ typeid c++14 tdm-gcc

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

WinAPI中的菜单:我是否将WMARAM或WPARAM用于WM_COMMAND?

我最近开始自学WinAPI,所以请耐心等待.

编译器:TDM-GCC 4.9.2
操作系统:Windows 8.1 64位

我最近学会了如何使用资源创建菜单.关于这一点,我注意到处理菜单的WM_COMMAND消息有些奇怪.在MSDN文档告诉我,如果我要处理从菜单中发送的消息,命令项ID可以在WPARAM的低位字中; 所以我假设我的窗口过程中的代码看起来像这样:

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, LPARAM lParam, WPARAM wParam)
{
    switch (msg)
    {
    case WM_COMMAND:
        switch (LOWORD(wParam))  //<--
        {
        case /*IDs go here*/:

            break;
        }
        break;

    //...
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但是,我注意到菜单中的命令项不起作用.经过一些调试,我发现wParam总是0,我的ID实际上是在lParam中!我快速更改了以下代码:

switch (lParam)
{
case /*IDs go here*/:

    break;
}
Run Code Online (Sandbox Code Playgroud)

它的工作原理!

我的问题:为什么?
为什么文件说它在wParam中是什么时候我在lParam?

另外,这是我的resource.rc和resource.h文件,以防它有帮助:

"RESOURCE.H":

#define IDR_MYMENU 101

//These are appearing in LPARAM instead of WPARAM
#define ID_FILE_EXIT 9001
#define ID_STUFF_GO  9002
Run Code Online (Sandbox Code Playgroud)

"RESOURCE.RC":

#include "resource.h"

IDR_MYMENU MENU
BEGIN …
Run Code Online (Sandbox Code Playgroud)

c winapi menu wm-command

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

是否有语法来防止类的实例是const?

假设我创建了一个类,其中主要用例将使用户始终调用修改其成员的方法.或者,以另一种方式查看它,创建一个类,其中每个方法都将修改类成员.

例如,让我们使用这个虚拟类:

class Foo
{
public:
    void setM_1(int);
    void setM_2(char);
    void setM_3(float);

private:
    int     m_1;
    char    m_2;
    float   m_3;
};
Run Code Online (Sandbox Code Playgroud)

对于这个Foo类,创建const它的实例没有意义,因为每个方法都保证修改成员.

我的目标是:以这样的方式定义这个类 - const实例化这个类将没有任何效果.也就是说,const Foo实例可以调用Foo实例可以的每个方法.

通过标记每个方法const,声明所有非const成员mutable,并提供初始化类的所有成员的ctor,我能够实现此行为.

所以const-ignorant版本Foo看起来像:

class Foo
{
public:
    Foo()
    {
        m_1 = 0;
        m_2 = '\0';
        m_3 = 0.0f;
    }

    void setM_1(int)   const;
    void setM_2(char)  const;
    void setM_3(float) const;

private:
    mutable int     m_1;
    mutable char    m_2;
    mutable float …
Run Code Online (Sandbox Code Playgroud)

c++ const class mutable c++11

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

标签 统计

c++ ×2

c ×1

c++11 ×1

c++14 ×1

class ×1

const ×1

menu ×1

mutable ×1

tdm-gcc ×1

typeid ×1

winapi ×1

wm-command ×1