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

Я пытаюсь сделать следующее, используя метапрограммирование шаблона 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  
Interesting Posts

Является ли ключевое слово ‘override’ просто проверкой переопределенного виртуального метода?

Почему каждая ОС по-прежнему не может возобновить передачу файлов?

Как преобразовать имя переменной (object) в String

Преобразование цвета HSL в RGB

Чтение строки с помощью scanf () не очень хорошо?

В /etc/resolv.conf, что именно делает опция конфигурации поиска?

Статические члены classа занимают память, если объект этого classа не создается?

Почему C # реализует методы как не виртуальные по умолчанию?

Как преобразовать cue / bin mds / mdf в iso на Ubuntu?

Хороший инструмент для поиска дубликатов фотографий на основе данных изображения

Как получить поля в объекте через reflection?

Вручную установите ненавязчивую ошибку проверки в текстовом поле

Как удалить или деактивировать мою лицензию на Windows 7 на одном компьютере и использовать ее на другом

Является ли использование динамической считается плохой практикой?

Что в ваших .emacs?

Давайте будем гением компьютера.