这是我拥有的类模板(它有子类)的简化版本:
template<class T>
class Bitmap
{
public:
typedef T pixeltype;
Bitmap(const T* PixelData) : Data(/* PixelFormat enum based on T */) { ... }
virtual ~Bitmap() { ... }
...
protected:
Texture Data;
};
模板参数T
到Bitmap
可以是类A<X>
或A<Y>
(将来可能会更多),其中A
是类模板也是如此。基于T
,又称pixeltype
,我需要将其中一个枚举值PixelFormatX
或PixelFormatY
传递给Data
的构造函数,该构造函数需要int
1}}。
这可能吗?如果没有,我怎么能实现我所描述的呢?
为了完整性,这里的子类基本上是这样的:
template<class T>
class ColorizableBitmap : public Bitmap<T>
{
public:
typedef T pixeltype;
ColorizableBitmap(const T* PixelData) : Bitmap<T>(PixelData) { ... }
...
};
答案 0 :(得分:5)
我通常使用traits结构:
template<class T>
struct BitmapTraits
{
};
template<class T, class traits = BitmapTraits<T> >
class Bitmap
{
public:
typedef T pixeltype;
Bitmap(const T* PixelData) : Data(traits::PixelFormat) { ... }
virtual ~Bitmap() { ... }
...
protected:
Texture Data;
};
然后使用模板特化来定义每个类的特征:
template<>
struct BitmapTraits< A<X> >
{
static const int PixelFormat = PixelFormatX;
};
template<>
struct BitmapTraits< A<Y> >
{
static const int PixelFormat = PixelFormatY;
};
答案 1 :(得分:2)
您可以执行以下操作:
enum A {
x,y
};
class X {
public:
static A a;
};
class Y {
public:
static A a;
};
A X::a = x;
A Y::a = y;
template <class T>
class Bitmap {
public:
Bitmap(): Data(T::a) {
}
A Data;
};
<强>编辑:强> 在这种情况下,您可以执行以下操作:
enum A {
x,y
};
template <const A V>
class X {
public:
static A a;
};
template <const A V>
A X<V>::a = V;
template <class T>
class Bitmap {
public:
Bitmap(): Data(T::a) {
}
A Data;
};
int main() {
Bitmap<X<x>> b;
}
已编辑2: 如果我对你不好,你现在有两个嵌套的课程,你仍然可以这样做:
enum A {
x,y
};
template <typename T>
class B {
public:
typedef T t;
};
template <const A V>
class X {
public:
static A a;
};
template <const A V>
A X<V>::a = V;
template <class T>
class Bitmap {
public:
Bitmap(): Data(T::t::a) {
}
A Data;
};
int main() {
Bitmap<B<X<x>>> b;
}
替代方案是(建议Remy Lebeau
)模板专业化。