Все это для того, что бы дать пользователю возможность создавать UI без написания кода и соответственно перекомпиляции всей системы.
Нужно что то типа QML?
Если бы я решил изготовить собственную гуевую систему, то использовал бы идею "все - есть виджет".
Суть которой - единственный класс виджет реализует технику "виджет в виджете", и таки образом "из коробки" умеет трансформироваться в великое многообразие различных "конкретных виджетов" без необходимости дописывать код.
Пример:
auto form =
Form::create("form")
.size(10,10)
.position(100,100)
.title("Form")
.widget<Box>("box1")
.size(10,10)
.position(100,100)
.widget<Label>("label1")
.size(10,10)
.position(100,100)
.text("this is label")
.init()
.init()
.widget<Box>("box2")
.size(10,10)
.position(100,100)
.init()
.show();
Выше указанный код может быть как исходником на языке с++, так и обычным текстовым файлом, который можно подгрузить и распарсить в рантайме.
В любой момент времени можно заменить значение любого "свойства" порожденного виджета в рантайме.
Проблема может возникнуть только при необходимости добавить принципиально новые "базовые свойств" самого виджета.
Эту проблему можно решать по разному.
Одно из довольно интересных решений - в специальном xml-подобном файле описывается название свойства, и его поведение:
"что будет происходить если..."
в качестве источника данных выступают примитивные типы - обычные int/float/string/etc
(привет, вариант!)
Другие виджеты смогут "цеплять" новое доступное свойство по его символьному имени.
резюмируя: виджет - это просто коробка так называемых "свойств".
(привет, компонентная система!)
Коллекция доступных "свойств" может создаваться либо в нативном коде, либо в скриптах.
Разные виджеты - это на самом деле один и тот же виджет, просто с разным набором свойств.
Свойства, которые повесили на один виджет могут "общаться" друг с другом посредством системы сообщений.
И в соотвествии со своей бизнес-логикой выполнять некоторые действия.
В качестве переменных с которыми могут захотеть работать свойства, можно передавать вариантивный тип данных.
Потому что он поддерживает все фундаментальные типы, и с его помощью можно передавать динамические структуры любой сложности.
Вариантивный тип так же можно использовать для связки "свойства порожденного в скриптах" с нативным кодом с++.
Тогда "динамичность" вариативного типа позволит установить полноценное общение между "скриптом" и "нативным кодом" без необходимости перекомпилировать все приложение.