考虑一个抽象类 ImageSource ,它表示RGB格式的图像数据。可能存在具有不同颜色深度的不同实现。一种实现可以选择像
这样的像素表示struct Pixel{
uint8_t red;
uint8_t green;
uint8_t blue;
};
或其他像
struct Pixel{
uint8_t red : 2;
uint8_t green : 2;
uint8_t blue : 2;
uint8_t : 2;
};
我想以一种方式创建 ImageSource ,我可以从类定义中获得表示像素数据的结构,就像在这个示例中一样:
void debugPixel(ImageSource &source){
//ImageSource is abstract, each implementation may use a different pixel structure
uint8_t *data = source->getBuffer();
for(uint16_t i = 0; i < source->getWidth() * source->getHeight() * sizeof(source::Pixel); i += sizeof(source::Pixel)){
source::Pixel *pixel = data[i];
std::cout << "red: " << pixel->red << ", green: " << pixel->green << ", blue: " << pixel->blue;
}
}
ImageSource 可以像这样定义
class ImageSource{
public:
virtual uint8_t* getBuffer() = 0;
virtual uint16_t getHeight() const = 0;
virtual uint16_t getWidth() const = 0;
};
如果我只有一个实例(我不知道ImageSource实际上是哪种类型),有没有办法从类中检索一个类型(Pixel结构)?
答案 0 :(得分:1)
在上面的示例中,您希望根据类型以特定方式打印数据。我相信你也会有其他方法。
将Pixel移动到一个类(您可以将其保留为结构,非常接近C ++中的类),并为每个不同类型的Pixel对象实现输出运算符。实现Pixel内部Pixel类型所需的其他任何方法。
然后,您让语言为您确定类型和正确的方法。
答案 1 :(得分:0)
您可以使用专门的模板。
作为示例(即,您需要为每种类型的Pixel创建一个特定示例 - 此处我使用bool
和int
进行了推广):
template <typename T>
struct Print
{
static void print (const T v, FILE *op=(stdout))
{ return; }
};
template <>
struct Print<bool>
{
static void print (const bool v, FILE *op=(stdout))
{ fprintf (op, "%u", v); return; }
};
template <>
struct Print<int>
{
static void datafile (const int v, FILE *op=(stdout))
{ fprintf (op, "%d", v); return; }
};
您将使用以下内容:
#include <typeinfo>
void printPixel(Pixel *pixel)
{
Print<typeid(pixel->red)>::print(pixel->red);
return;
}