我可以根据模板参数将某个值传递给成员构造函数吗?
Can I pass a certain value to member constructor based on template argument?
这是我拥有的 class 模板(它有子classes)的简化版本:
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
的模板参数可以是 class A<X>
或 A<Y>
(将来可能会有更多),其中 A
也是一个 class 模板。基于 T
,又名 pixeltype
,我需要将枚举值 PixelFormatX
或 PixelFormatY
之一传递给 Data
的构造函数,它采用 int
.
这可能吗?如果没有,我该如何着手实施我所描述的内容?
为了完整起见,下面是子class的基本样子:
template<class T>
class ColorizableBitmap : public Bitmap<T>
{
public:
typedef T pixeltype;
ColorizableBitmap(const T* PixelData) : Bitmap<T>(PixelData) { ... }
...
};
你可以这样做:
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:
如果我理解你是对的,你现在有两个嵌套的 class,你仍然可以做类似的事情:
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
建议的那样)模板专业化。
我通常为此使用特征结构:
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;
};
然后使用模板特化来定义每个class的特征:
template<>
struct BitmapTraits< A<X> >
{
static const int PixelFormat = PixelFormatX;
};
template<>
struct BitmapTraits< A<Y> >
{
static const int PixelFormat = PixelFormatY;
};
这是我拥有的 class 模板(它有子classes)的简化版本:
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
的模板参数可以是 class A<X>
或 A<Y>
(将来可能会有更多),其中 A
也是一个 class 模板。基于 T
,又名 pixeltype
,我需要将枚举值 PixelFormatX
或 PixelFormatY
之一传递给 Data
的构造函数,它采用 int
.
这可能吗?如果没有,我该如何着手实施我所描述的内容?
为了完整起见,下面是子class的基本样子:
template<class T>
class ColorizableBitmap : public Bitmap<T>
{
public:
typedef T pixeltype;
ColorizableBitmap(const T* PixelData) : Bitmap<T>(PixelData) { ... }
...
};
你可以这样做:
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: 如果我理解你是对的,你现在有两个嵌套的 class,你仍然可以做类似的事情:
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
建议的那样)模板专业化。
我通常为此使用特征结构:
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;
};
然后使用模板特化来定义每个class的特征:
template<>
struct BitmapTraits< A<X> >
{
static const int PixelFormat = PixelFormatX;
};
template<>
struct BitmapTraits< A<Y> >
{
static const int PixelFormat = PixelFormatY;
};