これができないことを強く示唆するスレッドをいくつか見つけましたが、まったく同じ演算子と条件の組み合わせを使用するスレッドはありません。そのため、より具体的にお尋ねしたいと思います。うまくいけば、それが誰かにとって迅速かつ簡単な答えになることを意味します...何らかの形で!
ストレージのより大きなブロック内の値を管理するために作成されたプロキシ クラスの例を考えてみましょう。
class SomeProxyThing {
std::uint32_t storage;
public:
operator std::uint16_t() const
{
return storage & 0x0000FFFF;
}
SomeProxyThing &operator=(std::uint16_t const value)
{
storage &= 0xFFFF0000;
storage |= value;
}
};
すべての割り当てがユーザー定義operator
の s を介して機能するようにします。ユーザーは、この場合、「公開された」タイプのみを渡したり取り出したりできる必要がありますstd::uint16_t
。さまざまなプロキシ クラス タイプを使用している可能性があり、これをそれらすべてに適用したいと考えています。理想的には、どのような型の組み合わせでも、型を入力するだけで、後someProxy = anotherProxy
はコンパイラーに任せることができます。
しかし、代入の左側と右側が同じ型または継承に関連する型を持つ場合、デフォルトのコピー代入演算子 (もちろん) はこの目標と競合します。必要に応じて「公開された」値だけをコピーするのではなく、全体をコピーするstorage
ため、残りの半分を上書きします。uint32_t
そして当然のことです!ほとんどの場合。しかし、LHS と RHS の型が同じであっても、「変換によって割り当てる」方法が欲しいです。これを回避するために、次のことができます。
operator
ユーザー定義の sを使用して「プロキシ」コピーを実行するようにコピー代入演算子を再定義します。の- 私が保持する必要があるもの。とにかくまだsですが、定義された動作が必要です。struct
memcpy()
g++
- または
= delete
コピー代入演算子(TC 型に対して実行できるようになりました)。しかし、割り当てはまだそれを使用しようとし、コンパイル エラーをスローしますdelete
。これは、「オーバーロードの解決から私を除外する」のではなく、「選択されたオーバーロードの場合にエラーで中止する」ことを意味するためです。これを回避するには、変換演算子を使用してその結果から割り当てるようにコンパイラに明示的に指示する必要があります。
SomeProxyThing a, b;
a = 42;
b = static_cast<std::uint16_t>(a);
// a.k.a.
b.operator=( a.operator std::uint16_t() );
コンパイラに「優先オーバーロードによって生成されたエラーを無視し、次善のものを選択する」ように指示する方法はないようです。ある?より一般的には、そのような状況で、コンパイラに特定の sを自動的に使用/優先させるoperator
方法/ハック/恐ろしいクラッジはありますか?
つまり、理想的には、
SomeProxyThing a, b;
a = 42;
b = a;
それb = a;
は本当にこれを行うでしょう:
b = static_cast<std::uint16_t>(a);
// a.k.a.
b.operator=( a.operator std::uint16_t() );
これを手動で入力したり、 を使用しstatic_cast
たり、名前付きの get/set メソッドを実装したりする必要はありません。理想的には、そのようなプロキシへの読み取り/書き込みは、すべて=
.
私はそれが不可能だと強く思っています...しかし、確認はいいでしょう!