2010-08-19 13 views
8

C'è un modo per creare un elenco (ad esempio un array) di puntatori a ciascun metodo di una classe C++?Ottenere l'elenco dei metodi di una classe

Qualcosa come Type.GetMethods() nel framework .NET, ma utilizzando solo C++ standard.

+7

A meno che non lo si fa a mano. E questa è una cosa spaventosa da aver bisogno. Perché? – GManNickG

+0

@Gman: +1 per "cosa spaventosa da avere bisogno" –

+0

@GManNickG Perché non sarebbe possibile generare l'elenco di metodi di una classe C++ generando un albero di analisi della classe? –

risposta

6

No, questo non è possibile in generale. C++ non ha la stessa infrastruttura di metadati che possiede .Net.

Potresti fornirci uno scenario in cui desideri utilizzare queste informazioni? Potrebbe esserci un approccio migliore con C++

+0

Ormai era solo per curiosità.Voglio dire, ieri stavo pensando a una sorta di libreria per gestire i dati JSON, ma oggi non riesco a ricordare perché ho pensato a questo approccio -_-. Rimaneva ancora la domanda, così ho chiesto. –

+1

è una buona illustrazione di quanto siano diverse le lingue anche se la sintassi è simile all'aspetto. La mentalità su come risolvere i problemi è completamente diversa tra le due lingue. – tenfour

2

Creare una copia del file .h e scribacchiare con esso in un editor.

No, non c'è modo di farlo automaticamente.

0

Non ci sono meta classi in C++ solo oggetti e classi, quindi nessuna riflessione potrebbe non essere coinvolta, quindi la risposta è no.

0

È possibile ottenere le informazioni sul tipo utilizzando typeid ma non le informazioni sul metodo.

3

Non c'è modo.

Infatti, anche a livello di codice oggetto, una funzione di membro di classe statica non può essere distinta da una funzione autonoma, né una funzione di istanza di classe da una funzione autonoma che passa un puntatore a un oggetto.

Se si conosce lo schema di manegging dei nomi dei compilatori e si ha accesso al codice oggetto pre-collegato, è possibile decodificarlo, ma è molto lavoro per risultati incerti.

+1

+1 per l'approccio hardcore "get 'er done". – tenfour

1

Se davvero vuole fare questo, capitolo 8 della avanzata C++ Programmazione stili e idiomi da James Coplien (probabilmente a lungo dal momento fuori stampa, ma ho sentito Neil sarebbe disposto a vendere la sua copia a buon mercato) copre la programmazione con "exemplars" in C++. Non commettere errori, la funzionalità non è gratuita, ma può fornire funzionalità di tipo metaclass in C++.

Scomparso, non ricordo che abbia costruito la particolare capacità che stai cercando in una delle sue lezioni, ma è passato molto tempo da quando ho letto attentamente quel libro. È sempre possibile che non potrebbe essere fatto affatto, ma penso che funzionerebbe, se si può vivere con gli altri limiti di ciò che rivela.

2

Nel mio progetto, utilizzo macro speciali per la dichiarazione e la definizione dei membri della classe, quindi È possibile ottenere l'elenco dei membri della classe. Per esempio: dichiarazione

Classe: definizione

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

Classe:

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

DEFINE_MODULE_FUNCTION(GenerateK1AndK2) 
{ 
    //... 
} 
Problemi correlati