Я пишу код для транспонирования матрицы как часть изучения С++. Я делаю перегрузку оператора. Но обычно для транспонирования матрицы используется обозначение '
.
'
вообще оператор? Я понимаю, что если это между ' '
вы записываете символ, а если вы используете " "
вы записываете строку. Но это операторы или нет? Могу ли я перегрузить их как отдельных персонажей или даже целиком?
Могу ли я создавать новые операторы в C++, которые работают только с объектом определенного класса? Уловка, которую я использовал, заключается в перегрузке известных операторов, таких как +
, -
, ^
, ..., а затем с помощью #define
я изменяю способ обработки текста препроцессором, но в конце концов я все равно переопределяю существующий оператор, и я не могу использовать ни один. специальных символов, а букв.
Подробную информацию о перегрузке операторов см. в статье здесь.
Перегрузка операторов ограничена существующим набором операторов C++. Это оператор перегрузка, а не творчество. Вы не можете создавать новые операторы, такие как @
, и не можете превращать символы, не являющиеся операторами, такие как '
, в операторы.
Can I make new operators in C++ that only work on an object of a specific class?
Вы не можете создавать операторы новый. Вы можете только перепрофилировать существующие.
...then with
#define
I change how the preprocessor processes the text...
Вам, вероятно, не следует этого делать. Держитесь подальше от препроцессора. Это средство последней инстанции.
То, что я имел в виду под новыми операторами, которые работают только с объектом определенного класса, точно так же, как вы упомянули @ и тому подобное. Я полагаю, это невозможно, потому что компилятор понятия не имеет, что это значит?
Поскольку они не являются частью грамматики языка, компилятор не сможет разобрать эти новые операции.
Вы не можете создавать операторы, которых нет в стандарте C++. Они не будут частью грамматики и приведут к синтаксическим ошибкам.
Таким образом, возможности оператора связаны с тем, что разрешено синтаксисом и грамматикой языка (см. Ответ @afenster для ссылки на список).
Кстати, эта проблема с оператором актуальна и для других языков, таких как Python, где комитет должен решить, имеет ли смысл добавление нового оператора (например, @
для матричного умножения) для языка или нет. Многие операторы являются производными от математических выражений, поэтому добавление новых операторов, которые не имеют этой математической основы, не имеет смысла (исключениями являются, например, *
, ()
).
Список операторов, которые вы можете перегрузить, — здесь. К сожалению (или к счастью), вы не можете использовать какой-либо другой символ в качестве оператора. Самая основная причина этого заключается в том, что перегрузка операторов не меняет и не должна изменять логику разбора синтаксиса вашего кода (например, что является оператором, а что нет, каков приоритет оператора и т. д.).
Вы можете только перегружать существующие операторы.
Можно немного подделать.
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
.
Также обратите внимание, что при перегрузке оператора вы можете создавать возможности для использования типа не по назначению. Не радуйтесь перегрузке операций, если это действительно не повышает ясность кода.