1

クラス内から、メンバーへのポインターが必要なテンプレートの typedef を作成しようとしています。これを説明する最善の方法は、最小限のサンプル コードを示すことです。

template<typename T, int T::*MV>
struct Bar
{
    const int &value(const T &t) const
    {
         return (t.*MV);
    }
};

struct Foo
{
    int baz;

    typedef Bar<Foo, &Foo::baz> GetBaz; // Compiler error
};

typedef Bar<Foo, &Foo::baz> GetFooBaz; // Compiles just fine

int main(int argc, char* argv[])
{
    Foo f = { 42 };
    Foo::GetBaz b; // Fails to compile
    GetFooBaz b2; // Fine

    int val = b.value(f); // Fails to compile because of above
    int val2 = b2.value(f); // Fine
}

この方法でメンバ ポインタにアクセスすることに必ずしも固執しているわけではありません。変数へのオフセットを知っていて、Bar::value 関数にトリッキーを実行させるだけで問題ありません。

最後の手段として、定義をクラスの外に移動するため、特性クラスを使用できると思いますが、使用されている変数の近くで typedef を宣言できるようにすることをお勧めします。

そして、「なぜそれをしたいのか」という質問に答えるために、これはすべて、MEF (C# の動作) を厳密に表す IoC コンテナーに関するものです。

私が使用している特定のコンパイラは VC12 ですが、VC11 でもサポートされていると便利です。

ありがとう

編集:

ここにエラーメッセージがあります

1>------ ビルド開始: プロジェクト: MemVarBug、構成: Win32 のデバッグ ------ 1> MemVarBug.cpp 1>memvarbug.cpp(20): エラー C2327: 'Foo::baz' : is型名、静的、または列挙子ではありません 1>memvarbug.cpp(20): エラー C2065: 'baz': 宣言されていない識別子 1>memvarbug.cpp(20): エラー C2975: 'MV': 'Bar' のテンプレート引数が無効です、予期されるコンパイル時の定数式 1> memvarbug.cpp(7) : 'MV' の宣言を参照 ========== ビルド: 0 成功、1 失敗、0 最新、0 スキップ = =========

4

1 に答える 1

0

次のトリックを実行できます。 baz を int[1] として宣言します。サイズ 1 の配列。この場合、baz を呼び出すとポインターが返され、*baz を呼び出すと値が返されます。

于 2012-07-07T17:49:44.327 に答える