aminought
@aminought

Как организовать внедрение зависимостей и использование шаблонов в С++?

Есть примерно такой код:

struct Object {}

template<class Img>
class IImageRecognizer {
public:
    virtual ~IImageRecognizer() {}
    virtual Object recognize(Img* img) = 0;
}

template<class Img>
class OpenCVRecognizer: public IImageRecognizer<Img> {
public:
    Object recognize(Img* img);
}

class App {
public:
    App(IImageRecognizer<cv::Mat>* recognizer);
private:
    IImageRecognizer<cv::Mat>* recognizer;
}

...
IImageRecognizer<cv::Mat>* recognizer = new OpenCVRecognizer<cv::Mat>();
App* app = new App(recognizer);

Могут быть мелкие недочёты, так как код писался на коленке. В общем, тут сразу видна проблема: класс App ничего не должен знать о внутренней реализации класса, отвечающего за распознавание изображений, но в данном случае у него есть информация о том, что класс использует cv::Mat. Вообще, в данном случае я использую шаблоны, чтобы методу recognize в разных подклассах можно было передать разные параметры, но что-то пошло не так. Как лучше организовать код подобного рода?
  • Вопрос задан
  • 161 просмотр
Решения вопроса 1
Шаблоны тут не нужны. Можно ввести свой класс изображения UniversalImage, который автоматически преобразует изображения между всеми используемыми форматами и выдаёт нужный:

class UniversalImage {
    boost::variant<cv::Mat, AnotherImage> internalImg_;
public:
    UniversalImage(const cv::Mat& img);
    UniversalImage(const AnotherImage& img);
    cv::Mat asCVMat() const;
    AnotherImage asAnotherImage() const;
};

С помощью этого UniversalImage можно будет придумывать иерархию обработчиков изображений.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы