有没有办法创建指向C ++类的每个方法的指针列表(例如数组)?
类似于.NET框架中的Type.GetMethods()
,但仅使用标准C ++。
答案 0 :(得分:6)
一般来说,这是不可能的。 C ++没有.Net拥有的相同元数据基础结构。
您能否向我们提供您想要使用此信息的方案?您可以使用更好的方法使用C ++
答案 1 :(得分:3)
没有办法。
实际上,即使在目标代码级别,也不能将静态类成员函数与独立函数区分开来,也不能将独立函数中的类实例函数与指针传递给对象。
如果你知道你的编译器名称修改方案,并且可以访问预链接的目标代码,你可能能够解码它,但这对于iffy结果来说是很多工作。
答案 2 :(得分:2)
复制.h文件并在编辑器中删除它。
不,没有办法自动完成。
答案 3 :(得分:2)
在我的项目中,我使用特殊的宏来进行类成员声明和定义 我可以获得班级成员名单。例如:
班级声明:
#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 )
{
//...
}
答案 4 :(得分:1)
如果真的希望这样做,那么James Coplien的高级C ++编程风格和成语的第8章(可能已经绝版了,但我听说Neil愿意廉价出售他的副本)用C ++中的“范例”来编写节目。不要搞错,这个功能不是免费的,但它可以/确实在C ++中提供类似元类的功能。
另一方面,我不记得他在他的课程中建立了你正在寻找的特殊能力,但是自从我仔细阅读这本书以来,已经有很长一段时间了。它总是可能根本无法完成,但我认为如果你能忍受他所披露的其他限制,它会起作用。
答案 5 :(得分:0)
C ++中只有对象和类没有元类,因此不能涉及任何反射,所以答案是否定的。
答案 6 :(得分:0)
您可以使用typeid获取类型信息,但不能获取方法信息。