2012-01-29 15 views
1

メンバ関数をstd :: mem_fnで格納してラップすることは可能です。メンバ変数ラッパー

Cでは、メンバ変数にoffsetof(...)を使用して、メンバ変数を厳密にラップすることができます(しかし、いくつかの型だけが対象です)。

C++でメンバー変数をラップすることはできますか?最もクリーンな方法は何ですか?

すなわち

class X 
{ 
    ... 
    M m; 
    ... 
}; 

mem_var<M> xm = &X::m; 

int main() 
{ 
    X x = ...; 
    M i = ...; 
    xm(x) = i; // same as x.m = i 
    cout << xm(x); // same as cout << x.m 
} 
+0

... – Pablo

答えて

3

はい、あなたはstd::mem_fn ...でそれを行うことができます。

struct B 
{ 
    int x; 
    int y; 
}; 

int main() 
{ 
    auto m = std::mem_fn(&B::y); 

    B b {0, 0}; 
    m(b) = 4; 

    printf("%d %d\n", b.x, b.y); // prints 0 4 
    printf("%d\n", m(b));   // prints 4 

    return 0; 
} 

デモ:唯一の我々は多型ラムダを持っていた場合http://ideone.com/40nI2

+0

は 'mem_fn'何をしますか? –

+0

@ Mr.Anubis:http://en.cppreference.com/w/cpp/utility/functional/mem_fn – kennytm

+0

ありがとうございますが、私はそれを保存するためにどのようなタイプを使用しますか? (あなたはautoを使用していますが、メンバー変数として格納する必要があります)関数<...>を使用してそれを行うことはできますか?もしそうなら、正しい型パラメータは何ですか? –