【问题标题】:Get the list of methods of a class获取类的方法列表
【发布时间】:2010-08-19 21:47:27
【问题描述】:

有没有办法创建指向 C++ 类的每个方法的指针列表(例如数组)?

.NET 框架中类似于 Type.GetMethods(),但仅使用标准 C++。

【问题讨论】:

  • 除非您手动操作,否则不会。这是一件可怕的事情。为什么?
  • @Gman:为“需要的可怕东西”+1
  • @GManNickG 为什么不能通过生成类的解析树来生成C++类的方法列表?
  • @AndersonGreen:对于编译器,当然。不适用于该语言的用户。
  • 面临同样的问题,但..如果有,它是无限的......

标签: c++


【解决方案1】:

不,这在一般情况下是不可能的。 C++ 没有 .Net 拥有的相同元数据基础设施。

您能否为我们提供一个您想使用此信息的场景?可能有更好的方法可以用于 C++

【讨论】:

  • 现在只是出于好奇。我的意思是,昨天我在考虑某种库来处理 JSON 数据,但今天我不记得我为什么想到这种方法 -_- 。问题仍然存在,所以我问了。
  • 这很好地说明了语言的不同之处,即使语法看起来很相似。两种语言解决问题的心态完全不同。
  • 晚了 7.5 年,但我有这种情况:一个类 TestFoobar 包含一堆静态方法 void test_* (void)(这些是类 Foobar 的单元测试)。在其他一些语言中,我可以枚举所有这些并执行与模式匹配的那些;这确保了所有方法都被真正调用。在 C++ 中,我相信这是不可能的,但我仍然在寻找答案——这就是我最终来到这里的原因;-)
【解决方案2】:

没有办法。

事实上,即使在对象代码级别,也无法区分静态类成员函数和独立函数,也无法区分类实例函数和传递对象指针的独立函数。

如果您知道您的编译器名称修改方案,并且可以访问预链接的目标代码,您可能能够对其进行解码,但对于不确定的结果来说,这需要做很多工作。

【讨论】:

    【解决方案3】:

    制作 .h 文件的副本并在编辑器中修改它。

    不,没有办法自动完成。

    【讨论】:

      【解决方案4】:

      如果你真的想要这样做,James Coplien 的 Advanced C++ Programming Styles and Idioms 第 8 章(可能早就绝版了,但我听说 Neil会愿意廉价出售他的副本)涵盖使用 C++ 中的“示例”进行编程。请不要误会,该功能并非免费提供,但它可以/确实在 C++ 中提供类似元类的功能。

      顺便说一句,我不记得他在他的一个课程中培养了你正在寻找的特定能力,但我也已经很长时间没有仔细阅读那本书了。它总是可能根本无法完成,但我认为它会起作用,如果你能忍受他所披露的其他限制。

      【讨论】:

        【解决方案5】:

        在我的项目中,我使用特殊的宏来声明和定义类成员,然后 我可以得到班级成员的名单。例如:

        类声明:

        #define DECLARE_MODULE_FUNCTION( function_name ) \
        JsonObject function_name( JsonObject value );
        
        #define DEFINE_MODULE_FUNCTION( function_name ) \
        static ModuleFunctionAdder< LotteryOddsModule > \
        __LINE__##function_name( L ## #function_name , &LotteryOddsModule::function_name );    \
        JsonObject LotteryOddsModule::function_name( JsonObject value )
        
        template< typename T >
        class ModuleFunctionAdder;
        
        class LotteryOddsModule
        {
        public:
            typedef JsonObject ( LotteryOddsModule::*ModuleFunction )( JsonObject );
        
            JsonValue Invoke( JsonValue json_value );
        
            DECLARE_MODULE_FUNCTION( GenerateK1AndK2 );
        
        private:
            friend class ModuleFunctionAdder< LotteryOddsModule >;
            static std::map< WString , ModuleFunction > _module_functions;
        };
        
        template<>
        class ModuleFunctionAdder< LotteryOddsModule >
        {
        public:
            ModuleFunctionAdder( WString func_name , LotteryOddsModule::ModuleFunction func )
            {
                LotteryOddsModule::_module_functions[ func_name ] = func;
            }
        };
        

        类定义:

        JsonValue LotteryOddsModule::Invoke( JsonValue json_value )
        {
            return ( this->*_module_functions[ L"GenerateK1AndK2" ] ) ( json_value.get_obj() );
        }
        
        DEFINE_MODULE_FUNCTION( GenerateK1AndK2 )
        {
            //...
        }
        

        【讨论】:

          【解决方案6】:

          C++ 中没有元类,只有对象和类,因此不能涉及反射,所以答案是否定的。

          【讨论】:

          • 元类和反射是正交的,你的暗示是无效的。
          【解决方案7】:

          您可以使用typeid 获取类型信息,但不能获取方法信息。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2010-11-19
            • 2011-09-22
            • 1970-01-01
            • 2010-12-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多