создание и доступ к списку типов во время компиляции

Я пытаюсь сделать следующее, используя метапрограммирование шаблона c ++. Я хочу создать список типов, а затем собрать эти типы вместе и выполнить дальнейшую компиляцию в списке. Так, например:

foo.h:

class Foo { ... }; // INSERT ANY CODE HERE 

bar.h:

 class Bar { ... }; // INSERT ANY CODE HERE 

main.h:

 #include "foo.h" #include "bar.h" struct list_of_types { typedef /* INSERT ANY CODE HERE */ type; }; 

Я могу вставить любой код в слоты выше, если list_of_types :: type разрешает некоторое представление (например, boost :: mpl :: vector) списка, содержащего типы Foo и Bar. Применяются следующие ограничения:

  1. Код в foo.h не должен знать о коде в bar.h и наоборот. Должно быть возможно изменить порядок директив #include в main.h и не изменять какой-либо другой код.

  2. Код в main.h не должен изменяться, если я включаю в него дополнительные заголовки, которые добавляют в список дополнительные типы.

  3. Список типов должен быть доступен во время компиляции . Я планирую продолжить метапрограммирование с участием этого списка.

Решение, использующее общий заголовок, вариативные шаблоны и макрос:

 // Header common.h // A distinct Void type struct Void {}; template  struct concat; template  
 // Header foo.h #include  class Foo { }; typedef typename concat::type TypeListFoo; #undef TYPE_LIST #define TYPE_LIST TypeListFoo 
 // Header bar.h #include  class Bar { }; typedef typename concat::type TypeListBar; #undef TYPE_LIST #define TYPE_LIST TypeListBar 
 // Header main.h #include "foo.h" #include "bar.h" struct list_of_types { typedef TYPE_LIST type; }; // Or just typedef TYPE_LIST list_of_types; // Test #include  #include  template  
Давайте будем гением компьютера.