私は、と同様に動作する、より古いコードベースのビットパックの整数に置き換わるFlags
クラスを持っています。より新しいクラスを遵守するために、int
タイプからの暗黙的な変換を禁止したいと思います。単一の値に対して暗黙の変換を許可する
enum class Flag : unsigned int {
none = 0,
A = 1,
B = 2,
C = 4,
//...
};
class Flags {
public:
Flags();
Flags(const Flag& f);
explicit Flags(unsigned int); // don't allow implicit
Flags(const Flags&);
private:
unsigned int value;
};
私だけFlag
とFlags
タイプから暗黙の建設や割り当てを可能にしたいと思います。
void foo(const Flags& f);
foo(Flags(0)); // ok but ugly
foo(1); // illegal because of explicit constructor
foo(0); // illegal, but I want to allow this
これが可能である:しかし、私はまだいくつかの関数リテラル0
を受け入れるようにFlags
パラメータを取るの呼び出しではなく、他の整数をご希望ですか?他の値を許可しないで0
を暗黙的に変換できるようにするには?
「0」はなぜ特別なのですか? – tadman
void *を取るコンストラクタを追加して、0で呼び出すことができます。次に、ポインタがnullであることをctorにアサートします。それが頭に浮かぶ最初のことは、おそらくより清潔な方法でしょう。リテラル1は暗黙的にvoidに変換されません* –
@tadmanビットパックされた整数をとる関数呼び出しでは、ビットを渡しません。私のコードベースには、ビットベクトルにオプションのパラメータが格納されている関数呼び出しがたくさんあります。多くの場合、リテラル0で呼び出しが行われます。 – Rakurai