[英]Reference offset of member variable within POD declaration
有可能讓這個代碼以某種方式工作嗎? (當前獲得編譯錯誤,聲明MMVertex2F4B2F不存在)我不想將2包裝在另一個結構中,因為這會影響我現有代碼中類的可用性。
我需要在編譯時發生這一切,本質上TemplatedClass需要保存有關它的外部類的數據,我可以稍后通過創建TemplatedClass實例來訪問它。
struct MMVertex2F4B2F
{
MMPoint vertex;
MMColor4B col;
MMPoint tex;
struct TemplatedClass<offsetof(MMVertex2F4B2F, vertex)> {};
};
問候,詹姆斯
您可以將主類的數據放入子類型:
struct MMVertex2F4B2F
{
struct MMVertexData {
MMPoint vertex;
MMColor4B col;
MMPoint tex;
} Data;
struct TemplatedClass<offsetof(MMVertexData, vertex)> {};
};
(如果您通過成員方法訪問數據成員,您只需要根據此更改而不是所有代碼進行調整)
或者,可以將TemplatedClass<>
聲明為獨立(不是子類型),類似於特征模板。
您的代碼無效的事實表明其設計存在缺陷。
注意
struct TemplatedClass<offsetof(MMVertex2F4B2F, vertex)> {};
是無效的C ++代碼。 這是一個模板專業化,也就是說
template <> struct TemplatedClass<offsetof(MMVertex2F4B2F, vertex)> {};
(在這種情況下似乎沒有多大意義)它應該是模板實例的聲明,這將是
TemplatedClass<offsetof(MMVertex2F4B2F, vertex)> myInstanceVar;
對於其他人,我同意沃爾特的回答。
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 *
強制轉換更好。
睡覺后,我來到這個似乎有效的解決方案:
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)> {};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.