Nó rất dễ dàng để giới thiệu các nhà khai thác trung tố mới trong C++khai thác ghi vào người dùng định nghĩa
// User-defined infix operator framework
template <typename LeftOperand, typename Operation>
struct LeftHelper
{
const LeftOperand& leftOperand;
const Operation& operation;
LeftHelper(const LeftOperand& leftOperand,
const Operation& operation)
: leftOperand(leftOperand), operation(operation) {}
};
template <typename LeftOperand, typename Operation >
auto operator < (const LeftOperand& leftOperand,
Operation& operation)
{
return LeftHelper<LeftOperand, Operation>(leftOperand, operation);
}
template <typename LeftOperand, typename Operation, typename RightOperand>
auto operator > (LeftHelper<LeftOperand, Operation> leftHelper,
const RightOperand& rightOperand)
{
return leftHelper.operation(leftHelper.leftOperand, rightOperand);
}
// Defining a new operator
#include <cmath>
static auto pwr = [](const auto& operand1, const auto& operand2) { return std::pow(operand1, operand2); };
// using it
#include <iostream>
int main()
{
std::cout << (2 <pwr> 16) << std::endl;
return 0;
}
Thật không may, điều hành quyền lực này có độ ưu tiên sai và associativity. Vì vậy, câu hỏi của tôi là: làm thế nào để sửa lỗi này? Tôi muốn số <pow>
của mình có mức ưu tiên cao hơn *
và liên kết ở bên phải, giống như ký hiệu toán học.
Chỉnh sửa Có thể thay đổi mức độ ưu tiên bằng cách sử dụng các dấu ngoặc khác nhau, ví dụ: |op|
, /op/
, *op*
hoặc thậm chí, nếu một trong số đó nghiêng, <<--op-->>
, nhưng không thể cao hơn giá trị ưu tiên cao nhất được tích hợp sẵn theo cách này. Nhưng ngày nay C++ là rất mạnh mẽ với lập trình meta mẫu và loại khấu trừ, chỉ đơn giản là phải có một số cách khác để đạt được kết quả mong muốn.
Ngoài ra, sẽ rất tuyệt nếu tôi có thể sử dụng pow
và không phải pwr
. Thật không may trong một số triển khai #include <cmath>
mang pow
vào không gian tên chung, do đó sẽ có xung đột. chúng ta có thể quá tải operator not
như vậy mà một lời tuyên bố của mẫu
not using std::pow;
loại bỏ std::pow
từ không gian tên toàn cầu?
Đọc thêm: a related proposal by Bjarne Stroustrup.
"dễ dàng" .......... ha ha. (như, nghiêm túc, tôi hy vọng đây chỉ là mục đích nghiên cứu) –
Bạn * không thể * "phát minh" toán tử mới, bạn chỉ cần sử dụng toán tử hiện tại để mô phỏng một cái gì đó hoạt động tương tự như toán tử nhưng không phải là toán tử thực tế. Đó là lý do tại sao các nhà điều hành ưu tiên không hoạt động. Và để trả lời câu hỏi của bạn, không có cách nào để sửa lỗi này. –
Đây là một ý tưởng tương tự với toán tử "chạy tới": 'while (i ----> 0)'. Rất tiện dụng! – user2079303