2010-08-19 5 views
8

¿Hay alguna manera de crear una lista (por ejemplo, una matriz) de punteros para cada método de una clase de C++?Obtener la lista de métodos de una clase

Algo así como Type.GetMethods() en .NET framework, pero utilizando solo C++ estándar.

+7

No a menos que hacerlo a mano. Y eso es algo aterrador de necesitar. ¿Por qué? – GManNickG

+0

@Gman: +1 por "algo espeluznante" –

+0

@GManNickG ¿Por qué no sería posible generar la lista de métodos de una clase C++ generando un árbol de análisis sintáctico de la clase? –

Respuesta

6

No, esto no es posible de forma general. C++ no tiene la misma infraestructura de metadatos que posee .Net.

¿Podría proporcionarnos un escenario en el que desea utilizar esta información? Puede haber un mejor enfoque que pueda usar con C++

+0

Por ahora solo era por curiosidad.Quiero decir, ayer estaba pensando en algún tipo de biblioteca para manejar datos JSON, pero hoy no puedo recordar por qué pensé en este enfoque -_-. Todavía la pregunta seguía así, así que pregunté. –

+1

es una buena ilustración de cuán diferentes son los idiomas, incluso si la sintaxis tiene un aspecto similar. La mentalidad de cómo resolver problemas es completamente diferente entre los dos idiomas. – tenfour

2

Haga una copia del archivo .h y corte con él en un editor.

No, no hay forma de hacerlo automáticamente.

0

No hay metaclases en C++ solo objetos y clases, por lo tanto, no se puede involucrar la reflexión, por lo que la respuesta es no.

0

Puede obtener la información del tipo usando typeid pero no la información del método.

3

No hay manera.

De hecho, incluso en el nivel de código de objeto, una función de miembro de clase estática no se puede distinguir de una función independiente, ni una función de instancia de clase de una función independiente pasando un puntero a un objeto.

Si conoce el esquema de creación de nombres de compiladores y tiene acceso al código de objeto pre-vinculado, es posible que pueda decodificarlo, pero eso es mucho trabajo para resultados dudosos.

+1

+1 para el enfoque hardcore de "haz que te hagan". – tenfour

1

Si realmente quiere hacer esto, el capítulo 8 de avanzada C++ estilos de programación y de idiomas por James Coplien (probablemente largo desde fuera de impresión, pero oye Neil estaría dispuesto a vender su copia barata) cubre la programación con "ejemplos" en C++. No se equivoque, la capacidad no es gratuita, pero sí puede proporcionar capacidades similares a metaclases en C++.

Offhand, no recuerdo haber construido la capacidad particular que está buscando en una de sus clases, pero ha pasado mucho tiempo desde que leí ese libro con cuidado. Siempre es posible que no se puede hacer en absoluto, pero creo que funcionaría, si puede vivir con las otras limitaciones de lo que revela.

2

En mi proyecto, utilizo macros especiales para la declaración y definición de miembros de la clase, luego Puedo obtener la lista de miembros de la clase. Por ejemplo: declaración

Clase: definición

#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; 
    } 
}; 

Clase:

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

DEFINE_MODULE_FUNCTION(GenerateK1AndK2) 
{ 
    //... 
} 
Cuestiones relacionadas