2010-08-19 27 views
8

Bir C++ sınıfının her bir yöntemine işaretçi listesi oluşturma (ör. Bir dizi) oluşturmanın bir yolu var mı?Bir sınıfın yöntem listesini alın

.NET çerçevesinde Type.GetMethods() gibi bir şey var, ancak yalnızca standart C++ kullanıyor.

+7

değil elle yapmadıkça. Ve bu ihtiyaç duyulacak korkunç bir şey. Niye ya? – GManNickG

+0

@Gman: "İhtiyacı olan korkutucu bir şey" için +1 –

+0

@GManNickG Neden sınıfın ayrıştırma ağacını oluşturarak bir C++ sınıfının yöntemleri listesini oluşturmak mümkün olmazdı? –

cevap

6

Hayır, bu genel olarak mümkün değildir. C++, .Net'in sahip olduğu meta veri altyapısına sahip değil.

Bize bu bilgileri kullanmak istediğiniz bir senaryo sunabilir misiniz? C++

+0

Şimdilik sadece meraktan çıktı.Demek istediğim, dün JSON verilerini işlemek için bir tür kütüphane düşünüyordum, ama bugün bu yaklaşımı neden düşündüğümü hatırlayamıyorum -_-. Yine de soru kaldı, ben de sordum. –

+1

, sözdizimi benzer görünüyor olsa bile dillerin ne kadar farklı olduğunu gösteren iyi bir örnektir. Sorunları çözmenin zihniyeti iki dil arasında tamamen farklıdır. – tenfour

2

.h dosyasının bir kopyasını çıkartın ve bir editörde kopyalayın.

Hayır, otomatik olarak yapmanın bir yolu yok.

0

ile kullanabileceğiniz daha iyi bir yaklaşım olabilir C++ 'da yalnızca nesne ve sınıflar için meta sınıfları yoktur, dolayısıyla yansıma bulunamazdı, dolayısıyla yanıt hayır.

0

Bilgi bilgilerini typeid kullanarak ancak yöntem bilgisini kullanarak alabilirsiniz.

3

Bunun bir yolu yoktur. Gerçekte, nesne kodu düzeyinde bile, bir statik sınıf üyesi işlevi tek başına bir işlevden ayırt edilemez, bir işaretçiyi bir nesneye geçiren bağımsız bir işlevden bir sınıf örneği işlevi de kullanılamaz.

Derleyicilerinizin ad-man şleme düzenini biliyorsanız ve önceden bağlanmış nesne koduna erişebildiğinizde, kod çözme olasılığınız olabilir, ancak bu çok parlak sonuçlar için çok fazla iş demektir.

+1

+1 hardcore "get 'er done" yaklaşımı için. – tenfour

1

Eğer gerçekten James Coplien'in tarafından Gelişmiş C++ programlama Stiller ve Deyimler ait bölüm 8, bunu yapmak istiyor (muhtemelen uzun beri baskısı tükenmiş ama Neil ucuza onun kopyasını satmaya istekli olacağını duymak) ise C++ 'da "örnek" ile programlamayı kapsar. Hata yapmayın, yetenek bedavaya gelmez, ancak C++ 'da metaclass benzeri özellikler sağlayabilir.

Offhand, onun kendi sınıfında birini aradığınız özel yeteneği inşa ettiğini hatırlamıyorum, ama bu kitabı da okuduğumdan beri çok uzun zaman geçti. Her zaman yapamayacağı her zaman olabilir, ancak ifşa ettiği diğer sınırlamalarla yaşayabilseydiniz çalışacağını düşünüyorum.

2

Projemde sınıf üyeleri için özel makrolar kullanıyorum ve tanımı, daha sonra Sınıf üyelerini listeleyebilirim.

Sınıf beyanı:

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

Sınıf tanımı: Örneğin

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

DEFINE_MODULE_FUNCTION(GenerateK1AndK2) 
{ 
    //... 
} 
İlgili konular