Я пытаюсь реализовать простую архитектуру типа «трубы и фильтры» в моем приложении. У меня будет общий базовый класс для всех фильтров, имеющих один входной и один тип выходного типа. Я бы зарегистрировал следующий фильтр для всех фильтров, поэтому они образуют простую цепочку. У меня есть одна небольшая проблема: как я должен отображать выходной тип следующего фильтра в качестве параметра типа (например, в прологе?), Вход следующего объекта должен соответствовать выходу текущего фильтра, но текущий фильтр не должен знать тип вывода следующего фильтра).Могут ли быть произвольные параметры шаблона, используемые в C++?
class IFilter
{
std::auto_ptr<TIn> params;
IFilter *nextFilter;
public:
typedef TIn TInType;
typedef TOut TOutType;
void SetParams(std::auto_ptr<TIn> param) { ...irrelevant code... }
virtual void Execute() = 0;
void Register(IFilter<TOutType, ???> *filter) { ...irrelevant code... }
};
Вы хотите длинные цепи? Если это так, то создание фильтра с другим изменяет его тип, поэтому результат должен быть другим значением. Вернее, если у вас есть фиотер 'A-> B' и фильтр' B-> C', то результатом их составления является 'A-> C'. Если регистрация просто перехватывает входные данные filter2s для ввода filter1s, я думаю, новое значение не требуется. Следующий вопрос: нужен ли вам абстрактный интерфейс или достаточно шаблон? Как насчет неявного преобразования - 'double' to' int' - вам все равно, хотите его заблокировать или хотите? – Yakk