Да много на чем можно подловить :) Например в D есть атрибуты, которыми можно декорировать все что угодно, а потом рефлексией разбирать и использовать. Та же сериализация, например:
struct Packet {
string name;
@optional("default_type")
string type;
@field("data_info")
int info;
}
В D можно на стадии компиляции импортнуть любой файл и благодаря настоящему CTFE, а не убогому плюсовому constexpr, распарсить этот файл в код. Например так сделан http-шаблонизатор Diet.
Дешный CTFE позволяет генерить парсеры на основе грамматики - либка pegged
Вообще зачем тебе рефлексия? Любые примеры практического применения мне лично попадались исключительно синтетические.
Это потому что в плюсах нет рефлексии. ;)
А у меня в проде трудится рефлексия не только для сериализации. В частности, при помощи классов у меня описываются, веб-интерфейсы. А библиотечка рефлексией генерит код для обработки HTTP-запросов.
Упрощенно:
class DataInterface : WebInterface {
@path("/data") {
auto getUsers(string p1, int p2) {...} // GET /data/users?p1=a&p2=10
auto getUserItems() {...} // GET /data/user/items
auto postUserInfo(string name, uint count) {...} // POST /data/user/info
}
@authenticated
auto getProfile(User user) {...} // GET /profile только для авторизованных пользователей, редирект, если не авторизован
}
А потом что-то вроде
auto server = listenHTTP(new DataInterface());
И все. Далее оно само зарефлексит DataInterface вытащит из него имена функций, имена и типы параметров, и сгенерит код, для соответствующего роутинга и валидации параметров.
В реальной либе все гораздо мощнее. Там и автоматическая сериализация/десериализация JSON, сессии, хуки и т.д. и т.п.
Также рефлексия применяется похожим образом для роутинга Remote Procedure Call, с упаковкой параметров функции в MessagePack.