【问题标题】:c++ macro to access name of enclosing classc ++宏访问封闭类的名称
【发布时间】:2019-08-23 06:33:27
【问题描述】:

为了澄清,我正在尝试创建一个宏,它使获取成员函数地址更容易一些,所以我希望输入当前类的成员函数名称(并且只有成员函数名称)和宏将使用变量的类型或封闭类的类型来实际访问函数。 例如

#define GETMEMBERFUNCTIONPOINTER(identifier) /*magic code goes here*/

struct myStruct {
    void (myStruct::*functionPointer)();
    void myMemberFunc() {

    }
    myStruct() {
        functionPointer = GETMEMBERFUNCTIONPOINTER(myMemberFunc);
    }
};

这可能吗?我管理的最接近的方法是让每个类都继承一个可以在宏中使用的私有 typedef

【问题讨论】:

  • 哇,对于 C++ 中的所有“弗兰肯斯坦怪物”开发,它仍然不允许 &myMemberFunc。有趣的是,如果您使用-fpermissive 调用它,GNU C++ 允许它作为扩展。
  • @Kaz“弗兰肯斯坦怪物”是描述我如何编码的好方法,所以我使用 c++ 的大部分人只是“为什么我无法获得指向析构函数的指针!怎么会我无法获得指向成员函数的直接指针!为什么我不能将其写入 typedef!”。这可能是一个不好的迹象。不过很高兴了解 GNU C++。

标签: c++ macros


【解决方案1】:

免责声明:Macros are evil. Do not use macros.

话虽如此,我相信您正在寻找的魔法代码会是

#define GETMEMBERFUNCTIONPOINTER(identifier) (&std::remove_pointer_t<decltype(this)>::identifier)

工作示例here

但是,我认为任何人都不应该实际这样做。如果您的设计需要如此频繁地使用成员函数指针,以至于您发现自己想要一个宏来为您做这件事,那么我强烈建议您在继续之前认真质疑您正在做的任何事情......

【讨论】:

  • 非常感谢!它完美地工作!相信我,我经常听到“我认为你需要重新考虑你在做什么”这句话,我明白了,但我忍不住想尝试那些通常违反代码标准的非常遥远的选项。我通常会弄清楚为什么它违反代码标准,或者发现它很奇怪但很实用。再次感谢!
  • @TechNeko 好吧,你已经被警告过了。断腿;-)
猜你喜欢
  • 1970-01-01
  • 2022-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-21
  • 2021-11-06
相关资源
最近更新 更多