C ++ создает новые операторы и перегружает текущие - PullRequest
3 голосов
/ 30 мая 2019

Я пишу код для транспонирования матрицы в рамках обучения C ++. Я занимаюсь перегрузкой операторов. Но обычно обозначение для транспонирования матрицы - '.

Является ли ' даже оператором? Я понимаю, что если между ' ' вы записываете символ, а если вы используете " ", вы записываете строку. Но эти операторы или нет? Могу ли я перегрузить их как отдельные символы или даже как целое?

Могу ли я сделать новые операторы в C ++, которые работают только с объектом определенного класса? Уловка, которую я использовал, заключается в перегрузке известных операторов, таких как +, -, ^, ..., а затем с помощью #define я меняю способ обработки текста препроцессором, но в конце концов я все равно переопределил бы существующий оператор, и я не могу использовать какие-либо специальные символы, а только буквы.

Ответы [ 4 ]

4 голосов
/ 30 мая 2019

Перегрузка операторов ограничена существующим набором операторов C ++. Это оператор перегрузка , а не создание . Вы не можете создавать новые операторы, такие как @, и не можете превращать неоператорные символы, такие как ', в операторы.

Могу ли я сделать новые операторы в C ++, которые работают только с объектом определенного класса?

Вы не можете сделать новых операторов. Вы можете только изменить существующие.

... затем с помощью #define я меняю способ обработки текста препроцессором ...

Вы, вероятно, не должны этого делать. Держитесь подальше от препроцессора. Это инструмент последней инстанции.

3 голосов
/ 30 мая 2019

Список операторов, которые вы можете перегрузить: здесь .К сожалению (или к счастью), вы не можете использовать любой другой символ в качестве оператора.Основная причина этого заключается в том, что перегрузка операторов не изменяет и не должна изменять логику синтаксического анализа вашего кода (например, что является оператором, а что нет, каков приоритет оператора и т. Д.).

3 голосов
/ 30 мая 2019

Вы не можете создавать операторы, которые не существуют как часть стандарта C ++. Они не будут частью грамматики и приведут к синтаксическим ошибкам.

Таким образом, возможности оператора связаны с тем, что разрешают синтаксис и грамматика языка (см. Ответ @afenster для получения ссылки на список).

С другой стороны, эта проблема оператора также актуальна в других языках, таких как Python, где комитет должен решить, имеет ли смысл добавлять новый оператор (например, @ для умножения матриц) для языка или нет. Множество операторов получаются из математических выражений, поэтому добавление новых операторов, не имеющих этого математического фона, не имеет смысла (например, *, ())

0 голосов
/ 30 мая 2019

Вы можете перегрузить только существующих операторов.

Вы можете немного подделать.

namespace my_operator {
  struct transpose_t {};
  constexpr tranpose_t transpose{};

  template<class Matrix>
  Matrix operator^( Matrix lhs, tranpose_t ) {
    lhs.Transpose();
    return lhs;
  }
}

с учетом этого и типа матрицы, который имеет метод .Transpose(), который самотранспонирует, мы получаем:

using my_operator::transpose;

MATRIX m = {/* whatever */};
MATRIX tm = m^transpose;

и tm будут транспонировать m.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...