2010-08-19 6 views
8

Есть ли способ создать список (например, массив) указателей для каждого метода класса C++?Получить список методов класса

Что-то вроде Type.GetMethods() в .NET Framework, но с использованием только стандартного C++.

+7

Не, если вы делаете это вручную. И это страшно, что нужно. Зачем? – GManNickG

+0

@Gman: +1 для «страшной вещи, которая нужна» –

+0

@GManNickG Почему бы не создать список методов класса C++, создав дерево разбора класса? –

ответ

6

Нет, это невозможно в общем виде. C++ не имеет той же инфраструктуры метаданных, что и .Net.

Не могли бы вы предоставить нам сценарий, в котором вы хотите использовать эту информацию? Там может быть лучший подход, который вы можете использовать с C++

+0

К настоящему времени это было просто из любопытства. Я имею в виду, вчера я думал о какой-то библиотеке для обработки данных JSON, но сегодня я не могу вспомнить, почему я думал об этом подходе -_-. Но вопрос остался, поэтому я спросил. –

+1

Это хорошая иллюстрация, как разные языки, даже если синтаксис похож. Менталитет решения проблем полностью отличается между двумя языками. – tenfour

+1

7.5yrs поздно, но у меня есть этот сценарий: класс 'TestFoobar' содержит кучу статических методов' void test_ * (void) '(это модульные тесты для класса' Foobar'). На некоторых других языках я мог просто перечислить все эти и выполнить те, которые соответствуют шаблону; это гарантирует, что все методы действительно называются. В C++ я считаю, что это невозможно, но тем не менее я искал ответ - вот почему я оказался здесь ;-) – ArchimedesMP

2

Сделайте копию файла .h и взломайте его в редакторе.

Нет, нет возможности сделать это автоматически.

0

Нет никаких мета классов в C++ только объектах и ​​классах, поэтому отражение не могло быть задействовано, поэтому ответ отрицательный.

0

Информация о типе вы можете получить, используя typeid, но не информацию о методе.

3

Невозможно.

Фактически даже на уровне объектного кода статическую функцию-член класса нельзя отличить от автономной функции, а также от функции экземпляра класса от автономной функции, передающей указатель на объект.

Если вы знаете схему составления имен компиляторов и имеете доступ к предварительно связанному объекту, вы можете его декодировать, но это большая работа для результатов iffy.

+1

+1 для хардкора «получить« сделанный »подход. – tenfour

1

Если вы действительно хотите сделать это, глава 8 Advanced C++ Программирование стилей и идиом Джеймсом Coplien (вероятно, давно уже вышли из печати, но я слышал, Нил будет готов продать свою копию дешево) охватывает программирование с помощью «экземпляров» на C++. Не делайте ошибок, возможности не предоставляются бесплатно, но они могут/предоставляют мета-подобные возможности на C++.

Оффлайн, я не помню, как он построил ту особенность, которую вы ищете, в один из его классов, но я долго не читал эту книгу. Всегда возможно, что этого не может быть сделано вообще, но я думаю, что это сработает, если вы сможете жить с другими ограничениями того, что он раскрывает.

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) 
{ 
    //... 
} 
Смежные вопросы