2013-08-05 27 views
6

Chúng tôi sử dụngA min = thành ngữ trong C++?

x += y 

thay vì

x = x + y 

Và tương tự cho *,/,- và nhà khai thác khác. Vâng, những gì về

x min= y 

thay vì

x = std::min(x, y) 

? Có một thành ngữ thường được sử dụng cho lệnh này, không yêu cầu phần mở rộng (không thể) của ngôn ngữ với một toán tử khác không?

+8

Yes. 'x min = y' thường được gọi là lỗi cú pháp *. :) –

+0

'if (y

+1

Bạn không thể phát minh ra toán tử mới trong C++ như vậy, vì vậy thành ngữ là những gì bạn đã viết: 'x = std :: min (x, y) '. –

Trả lời

21

Đó chắc chắn không phải là thành ngữ , nhưng bạn có thể sử dụng tên gọi được gọi là các toán tử có tên (xem những Q & Như herehere, được phát triển bởi @Yakk và @KonradRudolph), và viết

x <min>= y; 

mà có thể được thực hiện bởi quá tải operator<operator>, kết hợp với một thông minh bọc named_operator. Mã đầy đủ được đưa ra bởi các liên kết ở trên, nhưng sử dụng mã như

template <typename T1, typename T2, typename F> 
inline auto operator >(named_operator_lhs<T1, F> const& lhs, T2 const& rhs) 
    -> decltype(lhs.f(std::declval<T1>(), std::declval<T2>())) 
{ 
    return lhs.f(lhs.value, rhs); 
} 

Sử dụng std::min như mẫu đối số cho mẫu số F, sẽ cập nhật các LHS của biểu thức với các min của LHS và RHS.

+11

... đây là sự điên rồ ... (1 mặc dù, thực sự thú vị) – Dariusz

+3

+1 để chứng minh sức mạnh phức tạp được giải phóng bởi ma thuật mẫu – Hulk

+5

+1 vì nó tuyệt vời. Tên của bạn phù hợp với bạn: D – Xaqq

0

Bạn không thể viết loại câu này, chúng được dành riêng cho cú pháp dựng sẵn

1

NO. Không có những điều như vậy, bạn sẽ phải làm gì với std::min(x,y);

+0

Vì vậy, như câu trả lời được chấp nhận, có một điều như vậy ... – einpoklum

0

Các tùy chọn bạn có:

x = std::min(x,y) 

hoặc

x = y < x ? y : x; 

hoặc

if (y < x) x = y; 
1

Không, không thể tạo toán tử tùy chỉnh mới.

Bạn có một vài giải pháp có sẵn mặc dù:

llama_min_age = std::min(x, y); 
llama_min_age = (x < y ? x : y); 

Hoặc thậm chí một macro nếu bạn muốn:

#define MIN(x, y) ((x) < (y) ? (x) : (y)) 

Về vĩ mô: nó có thể dẫn đến lỗi xấu xa, vì vậy tôi muốn để sử dụng một trong hai giải pháp đầu tiên.

+0

Tôi muốn một thành ngữ cho nhiệm vụ có điều kiện, không phải cho các giá trị tối đa. – einpoklum

2

Bạn không thể mở rộng ngôn ngữ theo cách này.Gần nhất bạn có thể đến là một cái gì đó như:

template <typename T, typename U> 
T& 
mineq(T& lhs, U rhs) 
{ 
    if (rhs < lhs) { 
     lhs = rhs; 
    } 
    return lhs; 
} 

này sẽ cho phép bằng văn bản:

mineq(x, y); 

tôi đặt câu hỏi liệu nó có giá trị bận tâm, tuy nhiên.

0

C++ có một bộ giới hạn operatorskeywords.

Điều bạn đang cố gắng thực hiện nằm ngoài đặc tả C++ và không thể thực hiện được.

Bạn có thể làm việc so sánh và phân công với điều này một lót nếu bạn muốn:

x = (x < y) ? x : y;

+1

Bạn đã quên 6 ký tự khoảng trắng ... –

+0

Chỉ sáu ký tự? Tôi đếm tám. –

+0

@James 'x = (x SPACE1

Các vấn đề liên quan