我可以根据模板参数将某个值传递给成员构造函数吗?

时间:2015-03-26 06:38:15

标签: c++ templates

这是我拥有的类模板(它有子类)的简化版本:

template<class T>
class Bitmap
{
public:
  typedef T pixeltype;
  Bitmap(const T* PixelData) : Data(/* PixelFormat enum based on T */) { ... }
  virtual ~Bitmap() { ... }
  ...
protected:
  Texture Data;
};

模板参数TBitmap可以是类A<X>A<Y>(将来可能会更多),其中A是类模板也是如此。基于T,又称pixeltype,我需要将其中一个枚举值PixelFormatXPixelFormatY传递给Data的构造函数,该构造函数需要int 1}}。

这可能吗?如果没有,我怎么能实现我所描述的呢?

为了完整性,这里的子类基本上是这样的:

template<class T>
class ColorizableBitmap : public Bitmap<T>
{
public:
  typedef T pixeltype;
  ColorizableBitmap(const T* PixelData) : Bitmap<T>(PixelData) { ... }
  ...
};

2 个答案:

答案 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)模板专业化。