编译器: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()是未评估的背景,所以我不知道有什么区别.
我最近开始自学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) 假设我创建了一个类,其中主要用例将使用户始终调用修改其成员的方法.或者,以另一种方式查看它,创建一个类,其中每个方法都将修改类成员.
例如,让我们使用这个虚拟类:
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)