答案是否定的,如果没有某种吸气剂,你就无法做到这一点。但是,您可以使 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;