Я надеюсь, что можно написать шаблонный класс, который будет унаследован для нескольких подклассов, зависящих от типа. Я хочу, чтобы унаследованные методы и операторы возвращали тип подкласса, а не родительский тип шаблона. Это в надежде сэкономить много усилий на разработку и сопровождение, если мне придется изменить только один базовый класс.
Вот пример того, что у меня уже есть:
template<typename T> struct TMonoPixel
{
T value;
TMonoPixel(T v) { value = v; }
// the template has some pure virtual functions here...
TMonoPixel operator+ (const TMonoPixel& other)
{ return TMonoPixel(value + other.value); }
}
struct Mono8Pixel : TMonoPixel<uint8_t>
{
using TMonoPixel::TMonoPixel; // I want to inherit the constructor
// each pixel type implements the virtual functions in the template
}
Как видите, структура Mono8Pixel наследует оператор +
, который принимает TMonoPixel
, но при использовании этого оператора возвращается TMonoPixel<uint8_t>
вместо Mono8Pixel
, поскольку он определен в базовом классе.
Я планирую использовать эти структуры для перебора пикселей на изображении:
Image* img; // img has an unsigned char* pointer to its pixel data
for (int row=0; row<img->height; row++) {
for (int col=0; col<img->width; col++) {
int i = (row*img->width + col);
Mono8Pixel* pixel = reinterpret_cast<Mono8Pixel*>(img->dataPtr + sizeof(unsigned char)*i);
// modify the pixel ...
}
}
Есть ли способ изменить только класс шаблона, чтобы Mono8Pixel(2) + Mono8Pixel(2)
возвращал Mono8Pixel
?
Обратите внимание, что каким бы ни было решение, эти структуры должны поддерживать стандартную компоновку из-за того, как я хочу их использовать.