2012-01-29 42 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

如果我們的多態的lambda ... – Pablo 2012-01-29 12:36:34

回答

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'嗎? – 2012-01-29 12:08:43

+0

@ Mr.Anubis:http://en.cppreference.com/w/cpp/utility/functional/mem_fn – kennytm 2012-01-29 12:17:00

+0

謝謝,但是我用什麼類型來存儲它? (你正在使用auto,我需要把它作爲一個成員變量存儲)我可以使用函數<...>這麼做,如果是的話,它是什麼類型的正確參數? – 2012-01-29 12:36:55