是否可以以某种方式使用此代码? (当前获得编译错误,说明MMVertex2F4B2F不存在) 我不想将2包装在另一个结构中,因为这会影响我现有代码中类的可用性。
我需要在编译时发生这一切,本质上TemplatedClass需要保存有关它的外部类的数据,稍后我可以通过创建TemplatedClass实例来访问它。
struct MMVertex2F4B2F
{
MMPoint vertex;
MMColor4B col;
MMPoint tex;
struct TemplatedClass<offsetof(MMVertex2F4B2F, vertex)> {};
};
此致 詹姆斯
答案 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)> {};