具有可变(某种)类型的类指针字段?

时间:2015-02-10 16:40:35

标签: c++

我有一个名为“bitmap”的模板结构,如下所示:

enum PixelOption { I8, I16, I32, I64, F32, F64 };

template <PixelOption T> struct PixelOptionType;
template<> struct PixelOptionType < I8 > { using type = uint8_t; };
template<> struct PixelOptionType < I16 > { using type = uint16_t; };
template<> struct PixelOptionType < I32 > { using type = uint32_t; };
template<> struct PixelOptionType < I64 > { using type = uint64_t; };
template<> struct PixelOptionType < F32 > { using type = float; };
template<> struct PixelOptionType < F64 > { using type = double; };

template <PixelOption T>
struct Bitmap {
    using type = typename PixelOptionType<T>::type;

    uint32_t Width, Height;
    type* pData;

    Bitmap(uint32_t Width, uint32_t Height, uint32_t X, uint32_t Y, uint32_t SourceWidth, void* pData) {
        this->Width = Width; this->Height = Height; 
        this->pData = &reinterpret_cast<type*>(pData)[SourceWidth * Y + X];
    }

    type* Pixel(const uint32_t &X, const uint32_t &Y) {
        return &pData[Width * Y + X];
    }
};

现在我想在名为“channel”的结构中包含这些位图指针的向量,类似于

struct Channel {
    std::vector<Bitmap*> Fragments;
}

但编译器要我为指针声明模板参数。通道中的所有位图都是相同的类型(因此也是通道),但是向通道结构中添加模板参数实际上除了推动问题之外没有任何其他目的,因为我计划在即将到来的时候包含一个通道向量“图层”结构将面临同样的问题。

我想在通道结构的构造函数参数中包含像素选项,但似乎无法通过运行时转换(我希望避免)找到超越该向量声明的方法。

我尝试使用虚函数创建一个结构“BitmapBase”并在位图中继承它,但是通过创建一个位图基矢量,在其中存储位图对象并调用像素我只获得了虚函数结果,而不是(正如我所希望的那样)替换实际功能结果。

有人知道如何处理这个问题吗?

1 个答案:

答案 0 :(得分:0)

如果您使用BitmapBase路线,则需要BitmapBase::Pixel virtual。此外,如果问题只是std::vector<Bitmap<T>*>的不便,您可以使用template aliases。例如:

using <template T> BitmapPtrVec = std::vector<Bitmap<T>*>