POD声明中成员变量的引用偏移量

时间:2012-03-31 22:12:58

标签: c++ c

是否可以以某种方式使用此代码? (当前获得编译错误,说明MMVertex2F4B2F不存在) 我不想将2包装在另一个结构中,因为这会影响我现有代码中类的可用性。

我需要在编译时发生这一切,本质上TemplatedClass需要保存有关它的外部类的数据,稍后我可以通过创建TemplatedClass实例来访问它。

struct MMVertex2F4B2F
{
  MMPoint vertex;
  MMColor4B col;
  MMPoint tex;

  struct TemplatedClass<offsetof(MMVertex2F4B2F, vertex)> {};
};

此致     詹姆斯

4 个答案:

答案 0 :(得分:1)

您可以将主类的数据放入子类型中:

struct MMVertex2F4B2F
{
  struct MMVertexData {
    MMPoint vertex;
    MMColor4B col;
    MMPoint tex;
  } Data;
  struct TemplatedClass<offsetof(MMVertexData, vertex)> {};
};

(如果您通过成员方法访问数据成员,则只需根据此更改而不是所有代码进行调整)

或者,可以将TemplatedClass<>声明为独立(不是子类型),类似于特征模板。

您的代码不起作用这一事实表明其设计存在缺陷。

答案 1 :(得分:1)

请注意

struct TemplatedClass<offsetof(MMVertex2F4B2F, vertex)> {};

是无效的C ++代码。这是一个模板专业化,它将是

template <> struct TemplatedClass<offsetof(MMVertex2F4B2F, vertex)> {};

(在这种情况下似乎没有多大意义)它应该是模板实例的声明,这将是

TemplatedClass<offsetof(MMVertex2F4B2F, vertex)> myInstanceVar;

其他人,我同意沃尔特的回答。

答案 2 :(得分:0)

offsetof宏继承自C,它确实可以与POD结构一起使用,但它不是在C ++中引用成员的最佳方法。在指向成员的指针上参数化模板。

template< typename client, MMPoint client ::* > // PTM parameter
struct TemplatedClass {
    …
};

struct MMVertex2F4B2F
{
  MMPoint vertex;
  MMColor4B col;
  MMPoint tex;

  // PTM argument acceptable despite incomplete class:
  TemplatedClass<MMVertex2F4B2F, & MMVertex2F4B2F::vertex> template_inst;
};

此示例中的模板接受指向任何指定类中的MMPoint类型成员的指针。您可以使用其他一些参数化。任何东西都优于字节偏移并通过char *进行转换。

答案 3 :(得分:0)

睡觉之后,我找到了这个似乎有用的解决方案:

struct MMVertex2F4B2F
{
  MMPoint vertex;
  MMColor4B col;
  MMPoint tex;

  struct TemplatedClass;  //Use a forward declaration here
};

//The template will now work as MMVertex2F4B2F is fully declared
struct MMVertex2F4B2F::TemplatedClass
       : public VertDef <offsetof(MMVertex2F4B2F, vertex)> {};