Есть ли способ создать список (например, массив) указателей для каждого метода класса C++?Получить список методов класса
Что-то вроде Type.GetMethods()
в .NET Framework, но с использованием только стандартного C++.
Есть ли способ создать список (например, массив) указателей для каждого метода класса C++?Получить список методов класса
Что-то вроде Type.GetMethods()
в .NET Framework, но с использованием только стандартного C++.
Нет, это невозможно в общем виде. C++ не имеет той же инфраструктуры метаданных, что и .Net.
Не могли бы вы предоставить нам сценарий, в котором вы хотите использовать эту информацию? Там может быть лучший подход, который вы можете использовать с C++
К настоящему времени это было просто из любопытства. Я имею в виду, вчера я думал о какой-то библиотеке для обработки данных JSON, но сегодня я не могу вспомнить, почему я думал об этом подходе -_-. Но вопрос остался, поэтому я спросил. –
Это хорошая иллюстрация, как разные языки, даже если синтаксис похож. Менталитет решения проблем полностью отличается между двумя языками. – tenfour
7.5yrs поздно, но у меня есть этот сценарий: класс 'TestFoobar' содержит кучу статических методов' void test_ * (void) '(это модульные тесты для класса' Foobar'). На некоторых других языках я мог просто перечислить все эти и выполнить те, которые соответствуют шаблону; это гарантирует, что все методы действительно называются. В C++ я считаю, что это невозможно, но тем не менее я искал ответ - вот почему я оказался здесь ;-) – ArchimedesMP
Сделайте копию файла .h и взломайте его в редакторе.
Нет, нет возможности сделать это автоматически.
Нет никаких мета классов в C++ только объектах и классах, поэтому отражение не могло быть задействовано, поэтому ответ отрицательный.
Информация о типе вы можете получить, используя typeid, но не информацию о методе.
Невозможно.
Фактически даже на уровне объектного кода статическую функцию-член класса нельзя отличить от автономной функции, а также от функции экземпляра класса от автономной функции, передающей указатель на объект.
Если вы знаете схему составления имен компиляторов и имеете доступ к предварительно связанному объекту, вы можете его декодировать, но это большая работа для результатов iffy.
+1 для хардкора «получить« сделанный »подход. – tenfour
Если вы действительно хотите сделать это, глава 8 Advanced C++ Программирование стилей и идиом Джеймсом Coplien (вероятно, давно уже вышли из печати, но я слышал, Нил будет готов продать свою копию дешево) охватывает программирование с помощью «экземпляров» на C++. Не делайте ошибок, возможности не предоставляются бесплатно, но они могут/предоставляют мета-подобные возможности на C++.
Оффлайн, я не помню, как он построил ту особенность, которую вы ищете, в один из его классов, но я долго не читал эту книгу. Всегда возможно, что этого не может быть сделано вообще, но я думаю, что это сработает, если вы сможете жить с другими ограничениями того, что он раскрывает.
В моем проекте я использую специальные макросы для объявления классов и определения, затем Я могу получить список членов класса. Например: декларация
Класс: определение
#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)
{
//...
}
Не, если вы делаете это вручную. И это страшно, что нужно. Зачем? – GManNickG
@Gman: +1 для «страшной вещи, которая нужна» –
@GManNickG Почему бы не создать список методов класса C++, создав дерево разбора класса? –