как сделать коллекцию объектов, которые удовлетворяют определенной концепции - PullRequest
0 голосов
/ 21 мая 2019

У меня есть определенная функция, которая должна принимать в качестве параметра коллекцию объектов, создающих экземпляр определенного шаблона в настоящее время, я реализую его как A

template <typename Parser, typename ParserOutput>
 bool run_parsers(const vector<Parser>& parsers, shared_ptr<vector<ParserOutput> >);

, затем B

using SemanticParsers = variant<a list of my parsers>

затем где-то я создаю экземпляр C

vector<SemanticParsers> pars_vect;
factory creating and loading parsers, adding them to pars_vect
run_parsers(pars_vect, ptr_parser_outputs)

всякий раз, когда я хочу добавить новый анализатор в список, я делаю это классом, который реализует функциональность, ожидаемую A edit B, добавляя новый класс в реестр B редактирования C, которыйзнает, как создавать и загружать классы

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

Ответы [ 2 ]

0 голосов
/ 21 мая 2019

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

Скорее всего, ваша коллекция должна быть параметром шаблона.

template <template<class> typename Col, typename BaseParser, typename Out>
bool run_parsers(const Col<BaseParser>& parsers, shared_ptr<Col<ParserOutput> >);
0 голосов
/ 21 мая 2019

Если я правильно понял ваш вопрос ...

Передайте контейнер указателей / ссылок на Parser, которые фактически указывают на экземпляры вашего подкласса, и используйте виртуальные методы базового класса Parser для работы со всеми из них. Вам не понадобится вариант. Однако каждому классу может потребоваться немного статического кода, чтобы добавить себя в свою фабрику (в противном случае ему нужно будет знать обо всех синтаксических анализаторах).

И - заметьте, во время выполнения не существует такой вещи, как набор классов, поэтому ваш словарный запас немного перепутан.

...