То, что вы описываете, звучит очень похоже на шаблон строителя , и вы можете получить подобное поведение с синтаксисом, подобным этому:
// view would be EntityView<Location, Enemy, Flying>
auto view = makeBlueprint()
.AddComponent<Location>(...)
.AddComponent<Enemy>(...)
.AddComponent<Flying>(...)
.GetView();
При этом будет использоваться динамический компоновщик, в котором каждый добавленный компонент создаст немного другой компоновщик, такой как Builder<>
, тогда .AddComponent<Location>()
вернет Builder<Location>
, а затем Builder<Location, Enemy>
и т. Д.
Однако, это все еще не позволяет динамическую типизацию; что-то вроде этого не будет работать:
auto blueprint = makeBlueprint()
.AddComponent<Location>(...)
.AddComponent<Enemy>(...);
if (... some check ...)
blueprint = blueprint.AddComponent<Flying>(...);
auto view = blueprint.GetView();
Я сомневаюсь, что это решает вашу проблему, поскольку все еще должно быть динамически типизировано и не "динамически собирается во время выполнения". Но я надеюсь, что это даст вам понимание независимо.