2015-04-01 2 views
1

У меня сложный научный код C++, который использует несколько библиотек. Представьте себе, что существует 5 различных типов библиотек, таких как линейный решатель, инструмент интеграции и т. Д. Для каждого типа библиотеки существует несколько разных библиотек, которые выполняют точно то же самое, но имеют разную внутреннюю реализацию. Фактически, для каждой библиотеки реализуется класс-оболочка, так что все библиотеки одного типа имеют точно такой же интерфейс.C++ шаблоны зависят от ввода из файла

Теперь я хочу дать это программное обеспечение пользователю. Я хочу, чтобы пользователь мог выбирать библиотеки, которые они хотят использовать после того, как код уже скомпилирован. В настоящее время это делается с помощью входного файла.

Единственная проблема заключается в кодировании этого в основной программе. При выборе библиотеки кодирования я заканчиваю использование вложенных ifs, поэтому явно кодирует каждую возможную комбинацию библиотек, обусловленную параметрами, считанными из файла. Мне было интересно, есть ли способ сделать это.

ответ

2

Вы не можете внедрять шаблоны, зависящие от ввода из файлов, поскольку типы шаблонов разрешены в компиляции, а не во время выполнения.

Упорядоченный способ сделать это путем полиморфизма (также элегантный способ, D).

Определите базовый класс, который определяет интерфейс для каждой реализации, создайте классы Children каждый со своей собственной реализацией, а затем (используя ввод из файла ... или нет ... ваш вызов) разрешите, какой алгоритм использование полиморфизма.

:) Удачи.

+0

Использование шаблонов с вводом из файла выполняется таким образом a = read_file_a(); if (a == 1) {do_sth <1>(); } if (a == 2) {do_sth <2>(); } Этот код работает отлично, за исключением того, что он становится уродливым с несколькими параметрами шаблона. Я не могу сразу увидеть, как реализовать ваш совет, не могли бы вы написать короткий фрагмент с двумя параметрами шаблона? –

+0

Да, это должно сработать! Хотя при этом вы фактически не разрешаете шаблоны с использованием ввода из файлов, вы просто выбираете, какую скомпилированную (уже разрешенную) версию шаблона вы будете использовать в зависимости от ввода ... И учитывая это, существует более элегантный способ сделать это, который использует шаблоны проектирования и полиморфизм, например, используя Factory для создания желаемого объекта в зависимости от ввода, который вы получаете из файла, или, может быть, Decorator: http: //en.wikipedia .org/wiki/Factory_ (object-oriented_programming) http://en.wikipedia.org/wiki/Decorator_pattern –

+0

Спасибо за ваш совет :) Я предполагаю, что вышеупомянутые шаблоны используют динамический полиморфизм, не так ли? Вообще, мне сказали, чтобы он боялся, что это огонь, потому что у него немного накладные расходы. Знаете ли вы, насколько значительны эти накладные расходы в этом случае, и если это произойдет только во время инициализации класса или во время каждого вызова? –

Смежные вопросы