Mam klasę Flags
, która zachowuje się podobnie do std::bitset
, która zastępuje bitowe liczby całkowite w starszej bazie kodu. Aby wymusić zgodność z nowszą klasą, chcę zabronić niejawnej konwersji z typów int
.Zezwalanie na niejawną konwersję dla pojedynczej wartości
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;
};
Chciałbym umożliwić niejawnego budowę i przypisanie tylko z Flag
i Flags
typów. Chciałbym jednak jeszcze jak kilka wywołań funkcji, które mają parametr Flags
zaakceptować dosłownego 0
, lecz nie inne liczby całkowite:
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
to jest możliwe? Aby umożliwić niejawną konwersję 0
podczas blokowania innych wartości?
Dlaczego w tym miejscu jest specjalne "0"? – tadman
Możesz dodać konstruktora pobierającego void *, który zostanie wywołany przez 0. Następnie upewnij się, że wskaźnik ma wartość null w ctor. To pierwsza rzecz, która przychodzi do głowy, być może jest to czystszy sposób. Literał 1 nie będzie konwertować niejawnie na pustkę * –
@tadman W wywołaniach funkcji, które pobierają bitową liczbę całkowitą, nie przekazuje ona żadnych bitów. W mojej bazie kodu istnieje wiele wywołań funkcji, w których wektor bitowy zawiera opcjonalne parametry, i wiele razy wywołanie jest wykonywane za pomocą dosłownego 0. – Rakurai