Повысить, как создать карту для выбора типов? - PullRequest
1 голос
/ 17 апреля 2011

, поэтому я используйте BOOST.EXTENTION для загрузки модулей. У меня есть специальный файл, который описывает каждый модуль. Я читаю переменные из этого файла.

так такой пример:

shared_library m("my_module_name");
// Call a function that returns an int and takes a float parameter.
int result = m.get<int, float>("function_name")(5.0f);
m.close();

для меня превратится в:

shared_library m("my_module_name");
// Call a function that returns an int and takes a float parameter.
int result = m.get<myMap["TYPE_1_IN_STRING_FORM"], myMap["TYPE_2_IN_STRING_FORM"]>("function_name")(5.0f);
m.close();

Как создать такую ​​карту, которая бы соответствовала стандарту и типам костюмов?

Обновление:

может быть с вариантом :

  shared_library m("my_module_name");
  int result = m.get<boost::variant< int, float, ... other types we want to support >, boost::variant< int, float, ... other types we want to support > >("function_name")(5.0f);
    m.close();

может остановиться? поэтому нам было бы все равно, если в нем объявлены все типы, которые мы хотим?

1 Ответ

1 голос
/ 17 апреля 2011

Для этого вам понадобится разнородная карта, то есть ее элементы могут быть разных типов.Кроме того, вам потребуется возможность возвращать типов из функций, а не только переменных.


Теперь гетерогенная карта была бы возможна с Boost.Variant или простым union, но это связывает ее со временем компиляции: нам нужно знать каждый тип, которыйможно создать этот вариант / объединение.
Конечно, Boost.Any можно хранить все и его собаку, но проблема возникает снова: вам нужно извлечь real наберите из этого Boost.Any снова.Проблема повторяется.И если вы знаете реальный тип, вы также можете просто сделать вариант / союз и избавить себя от неприятностей any_cast.


Теперь, для другой неприятной вещи:

m.get<myMap["TYPE_1_IN_STRING_FORM"], myMap["TYPE_2_IN_STRING_FORM"]>

Чтобы эта строка работала, вам понадобятся две функции, которых нет в C ++: возвращаемых типов и шаблонов времени выполнения .Давайте на мгновение проигнорируем первую точку.
Шаблоны , время компиляции , и функция get является таким шаблоном.Теперь, чтобы использовать этот шаблон, ваш myMap должен иметь возможность возвращать типы в время компиляции , в то время как он заполняется в время выполнения .Видите противоречие?Вот почему необходимы шаблоны времени выполнения.


К сожалению, именно эти три вещи невозможны (или чрезвычайно сложны и очень и очень ограничены) в C ++ во время выполнения: гетерогенные типы данных (без постоянного размера), возвращая типов и шаблонов .
Все, что включает типы, должно быть выполнено во время времени компиляции . Этот пост от @Gman несколько коррелирует с этой проблемой.Это определенно стоит прочитать, если вы хотите знать, что C ++ просто не может сделать.


Итак, сделайте вывод: вам нужно переосмыслить и реорганизовать вашу проблему и решение,: |

...