簡體   English   中英

POD聲明中成員變量的引用偏移量

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM