Извлечение свойств функции-члена с помощью отражения C++26C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Извлечение свойств функции-члена с помощью отражения C++26

Сообщение Anonymous »

Справочная информация: я пытаюсь написать инструмент генерации исходного кода (т. е. обычного текста), который генерирует заглушку реализации абстрактного базового класса. Это выглядит примерно так

Код: Выделить всё

namespace acme {

struct arg{};

class MyBase {
public:
virtual void f(int i, arg a) = 0;
};

}
генерация вывода, например, my_class.cpp

Код: Выделить всё

namespace client {

class MyClass : public acme::MyBase {
public:
void f(int i, acme::arg a) { throw std::logic_error("not implemented"); }
};
}
Итак, актуальный вопрос: есть ли способ извлечь характеристики функции из std::meta::info функции-члена с использованием отражения C++26, возможно, в сочетании с метафункциями метапрограммирования шаблонов, такими как Boost.CallableTraits?
С помощью статического отражения C++26 я могу перебирать чистые виртуальные функции-члены класса следующим образом:

Код: Выделить всё

template for (constexpr auto mem : define_static_array(members_of(^^T, access_ctx))) {
if constexpr (is_pure_virtual(mem)) {
// now what?
}
}

Заманчивое решение — просто взять source_location_of(mem) и использовать его для копирования исходного объявления функции-члена, за вычетом виртуального и = 0; но это не будет правильно воспроизводить необходимость уточнения пространства имен для таких аргументов, как acme::arg.
С помощью такой библиотеки, как Boost.CallableTraits, я могу получить return_type и args типа функции-члена, но я немного теряюсь в склейке и необходимости использования алиасов, но я могу применить return_type_t или args_t к типу [: type_of(mem) :], потому что в противном случае идентификатор_of просто вернет псевдоним типа.

Подробнее здесь: https://stackoverflow.com/questions/798 ... reflection
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»