C ++ использует struct как некоторый тип - PullRequest
0 голосов
/ 22 мая 2018

Предположим, у меня есть эта структура:

struct shape{
    int type;
    shape(){}
    shape(int _type){type = _type;}
};

Возможно ли использовать форму как int напрямую?В этом случае форма будет принимать значение своего типа.Например:

shape s(2);
if     (s == 1) cout<<"this shape is a circle"<<endl;
else if(s == 2) cout<<"this shape is a triangle"<<endl;
else if(s == 3) cout<<"this shape is a rectangle"<<endl;
//...

В общем, возможно ли использовать структуру, чтобы она принимала выбранное значение одного из своих атрибутов?В случае формы это было int, но это может быть строка или любой другой тип.


РЕДАКТИРОВАТЬ: я пробовал код, предложенный @ Jarod42, используя строку как тип:

struct shape{
    string type;
    shape(){}
    shape(string _type){type = _type;}
    operator string() const {return type;}
}; 

И когда я пишу

shape s1("circle");
string s2 = "circle";
if(s1 == s2){ ...

, он говорит: ошибка: нет совпадения для 'operator ==' (типы операндов 'shape' и 'std :: string) , хотяс типом int он работает нормально.

Ответы [ 4 ]

0 голосов
/ 22 мая 2018

Если все, что вы хотите сделать в конце, это сравнить форму по строке, тогда есть более простое и намного безопаснее решение:

struct shape{
    std::string type;

    shape() {}

    bool operator==(std::string const& rhs) const {
      return type == rhs;
    }
};

// and if you want to be able to do string == shape.
bool operator==(std::string const& lhs, shape const& rhs) {
  return rhs == lhs;
}
0 голосов
/ 22 мая 2018

Хотя использование оператора приведения является одним из способов сделать это, как показывает @ Jarod42, я предлагаю сделать операцию более явной.

  1. Добавить функцию для получения типа.
  2. Используйте вызов функции и возвращаемое значение в операторах if-else.

struct shape{
    int type;
    shape(){}
    shape(int _type){type = _type;}
    int getType() const { return type;}
};

, а затем

shape s(2);
int type = s.getType();
if     (type == 1) cout<<"this shape is a circle"<<endl;
else if(type == 2) cout<<"this shape is a triangle"<<endl;
else if(type == 3) cout<<"this shape is a rectangle"<<endl;
0 голосов
/ 22 мая 2018

Как правило, вы можете использовать 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
};
0 голосов
/ 22 мая 2018

Вы можете добавить operator int:

struct shape{
    int type;
    shape(){}
    shape(int _type) : type(_type) {}

    operator int() const { return type; }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...