Как правило, вы можете использовать operator T
, где T
- это тип, который вы хотите разыграть.Если вы хотите принудительно использовать static_cast<T>(my_shape)
, тогда вы можете добавить ключевое слово explicit
впереди:
struct shape
{
int type;
shape() = default;
shape(int _type) : type{ _type } {}
operator int() const { return type; }
explicit operator float() const { return type; }
operator std::string() const
{
switch (type)
{
case 1:
return "circle";
case 2:
return "triangle";
case 3:
return "rectangle";
default:
break;
}
return "(unknown shape)";
}
};
Это будет работать со встроенными типами (int
, float
,double
), стандартные типы (std::string
, std::complex
), пользовательские типы struct / class или даже указатель или ссылка (например, если у вас есть статический массив значений).Вы можете подумать, нужны ли вам эти операторы преобразования (инкапсуляция - это совсем другое обсуждение), но это концептуально, как вы это сделаете.
В этом примере вы также можете захотетьввести enum
для хранения значений вашего типа:
struct shape
{
enum type_t
{
circle = 1,
triangle,
rectangle
};
type_t type;
operator std::string() const
{
switch (type)
{
case circle:
return "circle";
case triangle:
return "triangle";
case rectangle:
return "rectangle";
default:
break;
}
return "(unknown shape)";
}
shape(type_t _type) : type{ _type } {}
// rest of class as before
};