Giriş
C++11 ile gelen yeni bir özellik. enum kelimesinden sonra class kelimesi eklenerek Strongly Typed Enum oluşturulur. Şöyle yaparız.
class kelimesini kullanmamıza rağmen Strongly Typed Enum class değil. Cevabı görmek için şöyle yaparız. Çıktı olarak false alırız.
Açıklaması şöyle
Bazı kodlarda underlying type için const qualifier kullanılıyor. Bu qualifier aslında dikkate alınmaz. Açıklaması şöyle.
Yani şu koddaki const'un bir özelliği yok.
Şöyle yaparız.
Şöyle yaparız.
operator << metodu
Şöyle yaparız.
Şöyle yaparız.
int tipe çevirmek için kullanılır. Şöyle yaparız.
İmzası şöyle
Şöyle yaparız
C++11 ile gelen yeni bir özellik. enum kelimesinden sonra class kelimesi eklenerek Strongly Typed Enum oluşturulur. Şöyle yaparız.
enum class PlayerPiece {
AIRCRAFT,
BATTLESHIP,
CRUISER,
SUBMARINE,
PATROL,
EMPTY,
};
C++11 ile gelen diğer değişiklikler gibi saklama tipi (storage type) ve sıra numarası (ordinal number) verebiliriz. Şöyle yaparız.enum class CustomCommand : unsigned char
{
ENQ = 0x05,
ACK = 0x06,
NAK = 0x15,
};
Strongly Typed Enum Class mı?class kelimesini kullanmamıza rağmen Strongly Typed Enum class değil. Cevabı görmek için şöyle yaparız. Çıktı olarak false alırız.
#include <iostream>
enum class Enum
{
red = 1, blue, green
};
int main()
{
std::cout << std::boolalpha;
std::cout << std::is_class<Enum>::value << '\n';
}
Primitive Tipe Çevirmek - static_castAçıklaması şöyle
Şöyle yaparız.There are no implicit conversions from the values of a scoped enumerator to integral types, although static_cast may be used to obtain the numeric value of the enumerator.
PlayerPiece piece = ...
cout << static_cast<int>(piece) << endl;
Eğer static_cast kullanmazsak şu hatayı alırız.error: cannot convert 'PlayerPiece' to 'unsigned char'...
Primitive Tipe Çevirmek - std::underlying_typeBazı kodlarda underlying type için const qualifier kullanılıyor. Bu qualifier aslında dikkate alınmaz. Açıklaması şöyle.
colon (:), followed by a type-specifier-seq that names an integral type (if it is cv-qualified, qualifications are ignored) that will serve as the fixed underlying type for this enumeration type
enum foo : const unsigned int
{
F,
S,
T
};
ÖrnekŞöyle yaparız.
enum class foo_bar : unsigned
{
foo,
bar,
};
foo_bar bar = foo_bar::bar;
unsigned a = static_cast<std::underlying_type<foo_bar>::type>(bar);
ÖrnekŞöyle yaparız.
typedef std::underlying_type<foo_bar>::type int_type;
stringstream ss;
ss << int_type(rl);
Operator Metodları Tanımlamakoperator << metodu
Şöyle yaparız.
std::ostream& operator<<(ostream& os, RiskLevel rl) {
os << std::underlying_type<RiskLevel>::type(rl);
return os;
}
operator < metoduŞöyle yaparız.
bool operator<(RiskLevel rl1, RiskLevel rl2) {
return std::underlying_type<RiskLevel>::type(rl1) <
std::underlying_type<RiskLevel>::type(rl2);
}
operator + metoduint tipe çevirmek için kullanılır. Şöyle yaparız.
auto operator + ( RiskLevel value )
{
return std::underlying_type_t< RiskLevel >( value );
}
Şöyle yaparız.stringstream ss;
ss << + rl;
Şöyle yaparız.if ( + rl > + RiskLevel::Low ) {
...
}
operator ++ (int) metodu - post incrementİmzası şöyle
STEPS operator++(STEPS& s, int)
{
auto res = s; ++s; return res;
}
operator ++ metodu - pre incrementŞöyle yaparız
enum class STEPS
{
ONE,
TWO,
END_OF_LIST
};
STEPS& operator++(STEPS& s)
{
...
return s;
}
Kullanmak için şöyle yaparız++steps;
Merhaba,
YanıtlaSilNormalde < operator'ünü yazmaya gerek yok. Sadece yapılabileceğini gösteren bir örnek bu :)