C ++:从(不是)类实例中获取类型

时间:2014-04-02 18:20:27

标签: c++ class struct

考虑一个抽象类 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结构)?

2 个答案:

答案 0 :(得分:1)

在上面的示例中,您希望根据类型以特定方式打印数据。我相信你也会有其他方法。

将Pixel移动到一个类(您可以将其保留为结构,非常接近C ++中的类),并为每个不同类型的Pixel对象实现输出运算符。实现Pixel内部Pixel类型所需的其他任何方法。

然后,您让语言为您确定类型和正确的方法。

答案 1 :(得分:0)

您可以使用专门的模板。

作为示例(即,您需要为每种类型的Pixel创建一个特定示例 - 此处我使用boolint进行了推广):

   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;
}