Есть примерно такой код:
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 в разных подклассах можно было передать разные параметры, но что-то пошло не так. Как лучше организовать код подобного рода?