小编No *_*One的帖子

枚举和指向成员的指针

我最近尝试创建一个is_class类,并且需要一种方法让编译器区分枚举类型和定义了转换运算符的类类型.看到类,结构和联合是如何与指针到成员函数兼容的唯一类型,我决定让编译器确定用于实例化is_class模板的类型是否与指向成员函数的指针兼容.在遇到几个问题之后,我决定在与指向成员的指针一起使用时测试枚举的行为并得到一些古怪的结果.以下部分说明了第一个怪癖:

enum ENUM {};
void Test(void (ENUM::*pmem) (void))
{
    /* ... */
}
Test(NULL);
Run Code Online (Sandbox Code Playgroud)

使用Microsoft Visual C++ 2010进行编译时,函数定义的指向成员的部分: (ENUM::*pmem)

以红色突出显示,鼠标悬停在声明上显示错误:

Error: "ENUM" is not a class type

但是,编译器解析此段而不会遇到任何错误,分配pmemNULL.有趣的是,编译器允许这种看法,因为枚举类型不是类,结构或联合,因此不能拥有自己的方法.

第二个兴趣点出现在创建模板函数时,采用其类型不同的指向成员的参数:

template<class _Ty>
void Test_Template(void (_Ty::*pmem) (void))
{
    /* ... */
}
Run Code Online (Sandbox Code Playgroud)

当然为了使用这个功能,必须明确限定:

Test_Template<ENUM>(NULL);
Run Code Online (Sandbox Code Playgroud)

但是,此调用会生成错误说明:

invalid explicit template argument(s) for 'void Test(void (__thiscall _Ty::* )(void))'

我通过创建一个额外的函数模板解决了这个问题,该模板的原型将匹配任何未能匹配前模板函数原型的调用(涉及使用省略号).

问题:

  1. 为什么枚举与指向成员的指针兼容?

  2. Test编译器为模板Test_Template显式限定生成错误时,为什么在调用非模板函数时存在完全匹配?

c++ pointers enumeration member

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

标签 统计

c++ ×1

enumeration ×1

member ×1

pointers ×1