2016-03-28 19 views
5

Trong Python, chúng ta có cú pháp đơn giản tốt đẹp để lấy một int/float tùy ý đến một sức mạnh. Cụ thể, đối với bạn không Python lập trình viên, chúng ta có thể có các tuyên bố sau:Quá tải ** trong C++

y = 2 ** 3 
print y 

này sẽ in 8 đến giao diện điều khiển, và có cú pháp tốt đẹp như có một xây dựng trong điều hành "quyền lực". Có thể quá tải "**" như một toán tử đơn trong C++ không? Cụ thể, tôi muốn đạt được một cái gì đó như thế này:

int a = 2; 
int b = 3; 
cout << (a**b) << endl; 

hoặc, nếu điều này là không thể, một cái gì đó như thế này:

MyInt a = new MyInt(2); // Wrapper class around ints to play nicely with ** 
MyInt b = new MyInt(3); 
cout << (a**b) << end; // Assume ostream overridden for MyInt 

Đây cũng nên in 8 đến console. Tôi hiểu rằng sẽ dễ dàng hơn khi ghi đè lên toán tử "^" để làm điều tương tự, nhưng tôi chủ yếu quan tâm để xem liệu tôi có thể quá tải "**" hay không. Liệu toán tử "*" (đối với trường hợp lớp MyInt, nếu nó là một hàm thành viên) phải xem xét xem đối số có phải là "*" khác không, vì tôi không biết cách chỉ định "**" là một toán tử đơn lẻ? Thậm chí có thể vượt qua một toán tử làm đối số không?

Quy định bổ sung/tiền thưởng nếu có thể (như thể tôi chưa nói đủ): Không có macro !!!

+2

Nó được gọi là toán tử quá tải, bởi vì bạn khai thác quá tải. ** không phải là toán tử. – DeiDei

+1

Không làm quá tải toán tử^theo ý nghĩa của quyền lực, nó có độ ưu tiên thấp hơn ==, + hoặc - vì vậy nó sẽ gây ra nhiều bất ngờ. –

+0

@ ÖöTiib Điểm tuyệt vời! – mwm314

Trả lời

4

Bạn có ý nghĩa như thế này?

#include <iostream> 
#include <cmath> 

struct MyInt { 
    int val; 
    struct MyProxy { int val; }; 

    MyProxy operator *() const{ return MyProxy{val}; } 
    MyInt operator * (const MyProxy& b) { return MyInt{ static_cast<int>(std::pow(val, b.val)) }; } 

}; 

std::ostream& operator << (std::ostream& o, const MyInt& m) { return o << m.val; } 

int main(){ 
    MyInt a{5}, b{3}; 
    std::cout << a**b << std::endl; 
} 

Xem nó sống ở đây http://coliru.stacked-crooked.com/a/ab56b9cd6e422e12

Giải thích:

  1. quá tải toán tử * điều hành để trả về một đối tượng proxy
  2. quá tải nhị phân * điều hành để sử dụng proxy ... đơn giản :-)
  3. Tôi đã sử dụng lớp proxy để tránh các lỗi tinh tế.

C++ là niềm vui ... Tôi muốn tin rằng bạn đang làm này cho vui và không trong sản xuất ... Nguyên nhân của nó là một ý tưởng rất xấu trong sản xuất, chỉ cần gọi std::pow

+1

Chỉ vì một cái gì đó là có thể, nó không có nghĩa là nó là một ý tưởng tốt ... –

+2

Yea ... Tôi biết :-) ... Tôi muốn tin rằng OP muốn làm điều đó cho vui, không phải trong mã sản xuất – WhiZTiM

+0

Chỉ cần rõ ràng và rõ ràng: đây có thể là một trò chơi nhỏ vui nhộn (và tôi sẽ công khai thừa nhận, tôi đã tự làm điều đó và thích nó), nhưng ** không ** làm điều này trong mã sản xuất , hoặc bất cứ điều gì khác ngoại trừ hoàn toàn mã throwaway, được viết chỉ vì lợi ích của việc chơi một trò chơi. –

4

Câu trả lời ngắn: Không. Không có cách nào để "quá tải" chuỗi ký tự/mã thông báo tùy ý trong C++. câu trả lời

dài:a**b tương đương với a * (*b), vì vậy bạn có thể quá tải cả nhị phân * (ví dụ: nhân) và unary * (ví dụ: dereference) trong một số cách thô thiển. Nhưng điều đó sẽ hoàn toàn mờ đục/bất ngờ đối với bất kỳ ai đọc mã của bạn, và đau đớn để gỡ lỗi/duy trì trong tương lai.

Chỉ cần viết hàm có tên pow()!

+0

Đó là một thủ thuật rất bẩn. – mwm314

+0

Tôi lấy nó rằng nó không thể vượt qua một nhà điều hành như một đối số? – mwm314