То, что вы пытаетесь сделать, это часть определения reflection, более конкретно запускать информацию о типе времени (RTTI), что дает код в способность исследовать себя во время выполнения, я хорошо посмотрел на это некоторое время назад, пытаясь создать систему, которая будет сериализовать все переменные-члены переданного типа в формате, таком как { "varName"=<varValue> }
Unfortunat простой ответ заключается в том, что C++ не поддерживает рефлексию, и там, где она обеспечивает «аналогичную» функциональность (т. <type_traits>
и typeid()
) оставляет желать лучшего. Наилучшие результаты будут получены на этапах пользовательской сборки, которые генерируют нужные вам данные. Я решил отказаться от этого подхода, поэтому не может реально помочь с «как» в этом случае, но эти подходы, очевидно, ограничены в переносимости.
Однако подход специализации шаблонов, о котором вы уже упоминали, является шагом на пути к наилучшей реализации, которую я видел еще для отображения времени выполнения C++, которая использует комбинацию макросов для генерации дескрипторов классов.
МФЦ макросы DECLARE_DYNAMIC и IMPLEMENT_DYNAMIC все загрязнения необходимо создать один из этих дескрипторов для вашего класса, который затем добавить функции IsKindOf()
, GetRuntimeClass()
, etc., самый полезный часто будучи GetRuntimeClass()
, которая возвращает CRuntimeClass
.
Чтобы реализовать что-то подобное, вы могли бы использовать что-то вдоль линий;
#define MakeClassDescriptor(classname) \
private: \
class classname ## Descriptor \
{ \
public: \
static const char* GetName() { return #classname; } \
}; \
public: \
typedef classname ## Descriptor ClassDescriptor;
class Test
{
public:
Test() {};
MakeClassDescriptor(Test);
};
Который затем позволит вам получить доступ к имени через Test::ClassDescriptor::GetName()
Там в конечно другие подходы и ваши собственные спецификации диктуют, как можно реализовать это, для примера подход, при котором классы наследуют от шаблонного Класс RTTI рассмотрит статью «Использование шаблонов для отражения на C++», написанную Домиником Филионом в книге «Программирование игр». 5
Стандартный способ получить «имя» типа использует ['type_info'] (http://en.cppreference.com/w/cpp/types/type_info) класс, возвращаемый ['typeid'] (http://en.cppreference.com/ ж/CPP/язык/TypeID). Однако в стандарте C++ ничего не говорится о том, что * может быть именем, это может быть компиляторы, искаженное имя для типа или что-то еще. –
Но меня больше интересует, почему ты хочешь этого? Это похоже на [проблему XY] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem). –
@JoachimPileborg Я печатаю бенчмарк и просто хочу поместить заголовок в колонку времени. Я считаю, что, поскольку тип времени известен во время компиляции, я не должен повторять эту информацию в другом месте (и освободить место для обхода ошибок). В основном я использую [this] (http://stackoverflow.com/a/21995693/2567683) с более высокого уровня абстракции –