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

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

TBitmap 的模板参数可以是 class A<X>A<Y> (将来可能会有更多),其中 A 也是一个 class 模板。基于 T,又名 pixeltype,我需要将枚举值 PixelFormatXPixelFormatY 之一传递给 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;
};