2010-04-20 63 views
5

考慮下面的代碼:如何創建指向可變成員的指針?

struct Foo 
{ 
    mutable int m; 

    template<int Foo::* member> 
    void change_member() const { 
     this->*member = 12; // Error: you cannot assign to a variable that is const 
    } 

    void g() const { 
    change_member<&Foo::m>(); 
    } 
}; 

編譯器生成一個錯誤消息。問題是成員m是可變的,因此它允許更改m。但函數簽名隱藏了可變聲明。

如何decalre pointer-to-mutable-member來編譯這段代碼? 如果不可能,請鏈接到標準C++。

回答

8

根據C++標準5.5/5這個代碼是非法的構造:

上CV-資格, 的限制,並且其中操作數的 CV-限定符 組合以產生方式結果的cv限定符 與5.2.5中給出的E1.E2的 規則相同。 [注意: 不可能使用指向可變成員的指向會員的指針來修改常量類 對象。 例如,

struct S { 
    mutable int i; 
}; 
const S cs; 
int S::* pm = &S::i; // pm refers to mutable member S::i 
cs.*pm = 88;   // ill-formed: cs is a const object 

]

你可以使用包裝類按如下方式解決此問題:

template<typename T> struct mutable_wrapper { mutable T value; }; 

struct Foo 
{ 
    mutable_wrapper<int> m; 

    template<mutable_wrapper<int> Foo::* member> 
    void change_member() const { 
     (this->*member).value = 12; // no error 
    } 

    void g() const { 
    change_member<&Foo::m>(); 
    } 
}; 

但我認爲你應該考慮重新設計你的代碼。

+0

非常好..解決方法非常完美! – 2010-04-20 13:22:13