チェーンをサポートするためにconst参照をoperator=
返す必要があることはよく知られていますが、これは右辺値が値のようなものとして使用できる場合にのみ機能します。*this
*this
編集:問題ありません。constoperator=
以外の参照を返す必要があります(int
s として実行します)。これは、割り当て*this
で意味のあるものにする必要があることを意味しました。rhs
オーバーロードされた一時的な書き込み専用を返すことで、C++ クラスApiWrapper
を介して name=value セッター関数の C API をラップしていますが、API にはゲッター関数がないため、実質的に書き込み専用です。operator[]
Proxy
operator=
Proxy
ApiWrapper x;
x["a"] = x["b"] = 42; // x["b"] = 42; fine: consumes 42, returns *this
// x["a"] = x["b"]; error: x["b"] does not have the value
fromrhs
の代わりにconst 参照を返すと、連鎖がうまくいくように思えます。概念的に (プロキシ ボイラープレート コードは省略):*this
operator=
struct Proxy {
template <typename T>
T const& operator=(T const& rhs) const
{
... // pass rhs to the API but don't store it
return rhs; // return rhs, not *this
}
};
ApiWrapper x;
x["a"] = x["b"] = 42; // x["b"] = 42; fine: consumes and returns 42
// x["a"] = 42; fine: consumes and returns 42
しかし、これは私を疑わしくさせます。rhs
の代わりにconst 参照を返すことによる奇妙な副作用はあり*this
ますか? 私が考えられる唯一のことは、次のような式では使用できないということです(x["a"] = 42).doSomething()
がProxy
、書き込み専用であるため、とにかくそのようなものはサポートできません。それとも、チェーンを許可しない方がよいでしょうか (たとえば、 を返すことによってvoid
)?
編集:値のようなものではない場合でも、Proxy
代入をサポートすることは理にかなっていると思います。次のような構文糖衣を許可します。
// this: // rather than:
ApiWrapper w; API * ptr = make_api_instance();
w["name"] = "Batman"; api_set_str(ptr, "name", "Batman");
w["age"] = 42; api_set_int(ptr, "age", 42);
w["pi"] = 3.14; api_set_double(ptr, "pi", 3.14);