با سلام

هدف از تدوین این مقاله نحوه استفاده از مفاهیم بازتاب (Reflection) در نرم افزار های تولید شده با استفاده از زبان ++C می باشد.
همانطور که می دانید کامپایلرهای++C به صورت پیش فرض از مفاهیم بازتاب که در پلت فرم های مدیریت شده مانند #C و Java وجود دارد پشتیبانی نمیکند. که البته بحث بر سر اینکه چرا توسعه دهندگان استانداردهای ++C از چنین تکنیک هایی استفاده نمیکنند خارج از حوصله این مقاله هست و البته جستجوی مقالات زیادی که راجع به این بخش وجود دارد را هم به خود شما خواننده محترم می سپارم.

کتابخانه RTTR چه مکانیزمی دارد؟
RTTR به معنای بازتاب نوع زمان اجرا است. این قابلیت یک برنامه کامپیوتری را برای درک و تغییر یک شی در زمان اجرا توضیح می دهد.
هدف از این کتابخانه ارائه راه ساده و بصری برای استفاده از انعکاس در C++‎ است.
این کتابخانه برنامهنویس را قادر می سازد از انعکاس در برنامه خود استفاده کند. به این معناست که برنامه می تواند یک شی را در زمان اجرا ببیند که چه نوع خواص، متد ها یا سازنده هایی آن را تشکیل می دهد.
تصور کنید زمانی که یک اتصال دایمی دشوار اما همچنین پویا بین ماژول های نرم افزاری مورد نیاز است.
موارد اصلی استفاده از بازتاب برای مثال سریال سازی اشیاء، ایجاد UI، اتصال به زبان های برنامه نویسی دلخواه ، ارتباطات شبکه ، کلاسهای ORM برای کار با دیتابیس ها می باشد.

نحوه استفاده از این کتابخانه
رجیستر کردن کلاس ها
خواص، متدها و سازنده های خود را در فایل های منبع خود ثبت کنید.
تنظیم رابط کلاس فقط زمانی لازم است که از ارث بری استفاده شود.

#include <rttr/registration>
using namespace rttr;

struct MyStruct { MyStruct() {}; void func(double) {}; int data; };

RTTR_REGISTRATION
{
registration::class_<MyStruct>("MyStruct")
.constructor<>()
.property("data", &MyStruct::data)
.method("func", &MyStruct::func);
}

استفاده از تکرار گرها در بازتاب
با نوع شی شما می توانید از اعضای قبلا ثبت شده خود پرس و جو کنید.
البته شامل تمامی کلاسهای پایه قبلا ثبت شده نیز خواهد شد.

type t = type::get<MyStruct>();
for (auto& prop : t.get_properties())
std::cout << "name: " << prop.get_name() << std::endl;

for (auto& meth : t.get_methods())
std::cout << "name: " << meth.get_name() << std::endl;

استفاده از نوع Constructor برای ساخت اشیاء در زمان اجرا.
از طریق نوع شی یا شیء سازنده می توانید نمونه هایی از نوع خود را ایجاد کنید.

type t = type::get_by_name("MyStruct");
variant var = t.create(); // will invoke the previously registered ctor

constructor ctor = t.get_constructor(); // 2nd way with the constructor class
var = ctor.invoke();
std::cout << var.get_type().get_name(); // prints 'MyStruct'

استفاده از متدهای دسترسی در بازتاب
به راحتی می توانید در زمان اجرا با بازتاب به فیلدهای عضو کلاس دسترسی داشته باشید.

MyStruct obj;

property prop = type::get(obj).get_property("data");
prop.set_value(obj, 23);

variant var_prop = prop.get_value(obj);
std::cout << var_prop.to_int(); // prints '23'

فراخوانی متدها در زمان اجرا
فراخوانی یک متد مستقیم است.همچنین ممکن است از شی مورد استفاده برای فراخوانی یک متد استفاده شود.

MyStruct obj;

method meth = type::get(obj).get_method("func");
meth.invoke(obj, 42.0);

variant var = type::get(obj).create();
meth.invoke(var, 42.0);