答えは、ある種のゲッターなしではこれを行うことができないということです。ただし、getter を再利用可能にし、フィールドの単純な構文を (ほとんどの場合) 括弧なしで機能させることができます。
(C++11 が必要)
template<typename Friend, typename FieldType>
class crazyconst
{
FieldType value;
friend Friend;
FieldType& operator=(const FieldType& newValue) { return value = newValue; }
public:
operator FieldType(void) const { return value; }
FieldType operator()(void) const { return value; }
};
class A
{
public:
crazyconst<A, int> x;
void doStuff()
{
// Gettin' stuff done
x = 5; // OK
}
};
int main(int argc, char** argv)
{
A a;
int b = a.x;
int c = a.x(); // also works
}
C++03 バージョン: http://ideone.com/8T1Po
ただし、これはコンパイルされますが、期待どおりに動作しないことに注意してください。
const int& the_x = a.x;
a.doStuff();
std::cout << the_x;
OTOH、これは問題ないはずです:
const auto& ref_x = a.x;
a.doStuff();
std::cout << ref_x;