#type casting

wszystkie notatki oznaczone etykietą "type casting"

Wzorzec numeric_cast

Korzystając z wzorca numeric_limits, o którym wspomniałem w poprzedniej notce i informacjach o min/max wartości danego typu numerycznego, można w bardzo łatwy sposób stworzyć sobie bezpieczny, odporny na underflow/overflow, “operator” - wzorzec do konwersji wartości liczbowych pomiędzy poszczególnymi typami numerycznymi. template <typename TargetType, typename SourceType> inline TargetType numeric_cast(SourceType arg) { if (arg < std::numeric_limits<TargetType>::min()) throw std::underflow_error("bad numeric cast"); if (arg > std::numeric_limits<TargetType>::max()) throw std::overflow_error("bad numeric cast"); return static_cast<TargetType>(arg); } Drugi typ argumentu wzorca można pominąć, zostanie on wydedukowany przez kompilator na podstawie typu argumentu przekazanego do funkcji, więc konstrukcja ta przyjmuje prostą postać podobną do wbudowanych operatorów rzutowania:

Czytaj dalej

Niejawne przekształcenia typów

Konwersje typów zdefiniowanych przez użytkownika, czyli klas, są możliwe poprzez zdefiniowanie odpowiednich metod. Są nimi konstruktory konwersji dokonujące przekształcania z innych typów do naszego zdefiniowanego typu i operatory konwersji1 służące do przekształcania z typu zdefiniowanego przez użytkownika na inne typy. class X { public: X(int n); operator int(); operator double(); }; Operator i konstruktor konwersji nie zmienia typu istniejącego obiektu lecz tworzy nowy obiekt int tam, gdzie jest potrzebny. Wszędzie, gdzie dopuszcza się X można użyć int i odwrotnie.

Czytaj dalej