私はflagsクラスを持っていますが、整数の周りのラッパーにすぎず、基になる整数型の変換ルールに基づいて任意の整数型への明示的な変換を実装したいと考えています。C++の明示的積分ユーザー定義変換
すなわち
は
unsigned long long iflags = static_cast<unsigned long long>(flags);
で言う、私はまだint型以外の整数型に変換することができ
class Flags {
unsigned int v;
explicit operator unsigned int() { return v; }
}
私は(非関連メンバーを無視して)の線に沿ってクラスを持っていると言います
ではなく、
unsigned long long iflags = static_cast<unsigned int>(flags);
とするか、これを行うには整数型ごとに変換演算子を明示的に定義する必要がありますか?私はhttp://en.cppreference.com/w/cpp/language/cast_operatorを読んだが、私は私が避けたいすべての有効な変換を定義し、明示的に必要があると思わせる整数型に特有の任意のものを見ることができないC++ 14
を使用してい
注意。また、もし私が内部整数の最大値を知っていることに注目すると、ターゲットタイプへの変換が不可能なテンプレート変換関数に満足しています。つまり、すべてのフラグビットがマクロ/定数FLAGS_MAX
どんな用途のものでもあります。
コンパイラにはバグや非標準の拡張機能が含まれているかもしれませんが、*試しただけでヒントを得ることができます。 –
'explicit' *変換演算子*は、明示的に、または意図的にキャストする必要があります。 'static_cast(flags);'を実行すると、変換演算子 '演算子unsigned long long()'が要求されます。これはあなたのものではないので、プログラムは不正です。 –
WhiZTiM
最初のポイントは、最初のポイントが最初のポイントですが、誰も天気予報を言いませんでした。テンプレートを使用して、有効なすべての整数変換を定義し、フラグクラスのサイズを指定するという簡単な方法です。私は暗黙的な変換のためにこれがうまくいくことも理解していますが、偶然の変換を避けるため、クラスを暗黙的に整数型に変換することは望ましくありません。しかし、ターゲットタイプがすべてのフラグビットを保持できる限り、明示的な変換を行うときに基になるタイプが何であるかを考える必要はありません。 – glenflet