私はskypjackの答え@好きですが、このように何とかそれを書かれています:
#include <iostream>
template <class Parent, class Value> class ROMember {
friend Parent;
Value v_;
inline ROMember(Value const &v) : v_{v} {}
inline ROMember(Value &&v) : v_{std::move(v)} {}
inline Value &operator=(Value const &v) {
v_ = v;
return v_;
}
inline Value &operator=(Value &&v) {
v_ = std::move(v);
return v_;
}
inline operator Value&() & {
return v_;
}
inline operator Value const &() const & {
return v_;
}
inline operator Value&&() && {
return std::move(v_);
}
public:
inline Value const &operator()() const { return v_; }
};
class S {
template <class T> using member_t = ROMember<S, T>;
public:
member_t<int> val = 0;
void f() { val = 1; }
};
int main() {
S s;
std::cout << s.val() << "\n";
s.f();
std::cout << s.val() << "\n";
return 0;
}
一部enable_if
のは本当にコアへの一般的なように欠けているが、精神はそれを再作成することですコールをゲッターのように見えるようにします。
これは確かにトリッキーとfriend
です。
ほとんどすべては、いくつかの努力で可能であるが、それは努力の価値がありますか?なぜこれが欲しいのですか? – user463035818
@tobiすべてが可能なわけではなく、関係する作業が何であるか分からない場合に、どのように努力するのか分かりますか?私はこれが欲しいです。なぜなら、ライブラリユーザーに、通常適用されるよりも少ない迂回で、使いやすいインターフェースを提供するのに便利だと思われるからです。 – rubenvb
@rubenvb:関係する仕事にかかわらず、結果は残酷で、珍しく、そして最悪の場合、賢明になります。それはあなたのコードを維持しなければならないあなたの後継者に挑戦したいと思うものですか? –