2012-03-31 14 views
0

このコードは何とか動作させることはできますか? (現時点では、MMVertex2F4B2Fが存在しないことを示すコンパイルエラーが発生します) 既存のコード内でクラスのユーザビリティに影響を与えるので、2を別の構造体にラップしたくありません。POD宣言内のメンバ変数の参照オフセット

私はこのすべてをコンパイル時に実行する必要があります。基本的にTemplatedClassは、後でTemplatedClassのインスタンスを作成してアクセスできる外部クラスに関するデータを保持する必要があります。

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

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

よろしく、 ジェームズ

+0

使用 '構造体MMVertex2F4B2F'代わりにあなたの答えのための' MMVertex2F4B2F' – twain249

答えて

1

あなたは、サブタイプにあなたのメインクラスのデータを入れることができます:

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

(あなたはメンバーメソッドを経由してデータメンバにアクセスする場合は、あなただけ

また、TemplatedClass<>は、スタンドアロン(サブタイプではない)として宣言することもできます。形質テンプレートと同様です。

コードが機能しないということは、そのデザインに欠陥があることを示しています。

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

が有効なC++コードではないことを

+0

おかげで、別の構造体でラップするの使用を中断しますコードベースの残りの部分に渡るクラス。 – user1103741

1

は注意してください。どちらのこれは次のようになります(それはこの文脈ではあまり意味がありませんように見えるしていません)

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

だろうテンプレートの特殊化、それはテンプレートのインスタンスの宣言であるべきだ、ある

TemplatedClass<offsetof(MMVertex2F4B2F, vertex)> myInstanceVar; 

残りについては、ウォルターの答えに同意します。

+0

あなたの答えをありがとう。私は構造体の宣言をしたかったので、後でコードでインスタンス化することができました。 – user1103741

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 *です。

+0

私はOpenGL用に使用される頂点バッファにオフセットを設定するためにそれを使用していますので、さまざまな設定メソッドに渡すためにオフセットの値を整数にする必要があります。答えてくれてありがとう。 – user1103741

+0

@ user1103741また、あなた自身の 'offsetof'テンプレート関数を、メンバパラメータへのポインタを使ってロールすることもできます。これは依然として循環依存性を壊し、依然として整数を生成します。 – Potatoswatter

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)> {}; 
+0

これは動作しません。'template'キーワードを使わずにテンプレートを定義しようとしています。 – Potatoswatter

+0

うん私のミスが、それは読んでいる必要があります。 構造体MMVertex2F4B2Fを:: TemplatedClass:公共VertDef {}; – user1103741

+0

は、私が「編集」をクリックし、あなたのための答えにあなたのコメントをコピー、貼り付けました。しかし、同じタイプミスは、私たちがあなたの質問に答えるのを妨げています。私はupvoteまたはdownvoteかどうか分からない。 – Potatoswatter

関連する問題