回答
你不能。您只能重載現有的運算符,而不能用於內置類型。
我想知道(因爲我不喜歡不知道)如果C++ 14不透明typedef可以模擬內置類型來實現OP願意實現的目標。 –
@PaperBirdMaster文字數字將始終具有類型「int」。你可能能夠使用用戶定義的文字和東西,但是像'2 ** 16'這樣簡單的東西將永遠不會工作。 –
@ n.m。我知道你對文字的看法(這可能不僅僅是int),但我只是想知道/幻想'opaque typedef's,並且它們是否可以用於像OP想要的東西:'supertypedef int potato ;'和一個免費的操作符:'土豆操作符*(const potatoe a,const potatoe b){return std :: pow(a,b); }'但是現在我寫這個事件看起來很愚蠢事件 –
您不能重載內置類型的運算符。我會使用operator ^
用於自定義類型的此類用途。
不幸的是,可以在C++中重載的運算符集合是固定的,並且不包含**運算符。您可能會考慮使用operator^()
來代替,但事實證明^具有錯誤的優先級以充當指數運算符。
簡而言之,不幸的是,您無法做到這一點。
正如其他人所指出的:這是不可能的。您可以重載另一個運算符,例如^
來取指數,而不是使用簡單類型的包裝類/對象。
但是,如果您喜歡冒險,另一種方法是創建一個支持即時計算這種操作符的微型DSL。 (A famous example of that is LISP in C++)
但是,考慮到所付出的努力,它可能或可能不是你的一杯茶。但是,值得了解的是這種可能性存在。
UPDATE:
操作符重載超載現有運營商的作品。爲什麼?因爲如果你可以定義你自己的,你還必須定義這些操作符的優先級,這些操作符可以很容易地讓位於濫用操作符,通過提取它們的原始目的 - 這會增加讀代碼時的難度。 (至少這是做出的論點)。
具有接近**
的語義含義的最接近的運算符是插入符號運算符。這種運營商的天真和說明性實施是:
#include <iostream>
#include <cmath>
class Int {
public:
Int() {}
Int(int i) : value(i) {}
friend double operator^(const int& i, const Int& integer);
friend double operator^(const Int& integer, const int& i);
friend double operator^(const Int& lhs, const Int& rhs);
private:
int value;
};
double operator^ (const int& lhs, const Int& rhs) {
return std::pow(lhs, rhs.value);
}
double operator^ (const Int& lhs, const int& rhs) {
return std::pow(lhs.value, rhs);
}
double operator^ (const Int& lhs, const Int& rhs) {
return std::pow(lhs.value, rhs.value);
}
int main() {
Int i1 = 10;
Int i2 = 3;
double result = i1^i2;
std::cout << result;
return 0;
}
如果你願意作出妥協w.r.t. **
,感覺像混淆代碼:
#include <cmath>
#include <iostream>
struct foo {
foo(int i) : i_(i) {}
int operator*(int exp)
{
return std::pow(i_,exp);
}
private:
int i_;
};
struct bar {
} power_of;
foo operator*(int i, bar)
{
return foo{i};
}
int main()
{
std::cout << 2 *power_of* 3; // prints 8
}
否則,只需使用std::pow
。
可以添加'#define $$ * power_of *',所以它會是'2 $$ 3'。另外,我會使用從右到左的關聯運算符,如'* =',所以'4 $$ 3 $$ 2'的結果將是'262144'。 [** DEMO **](http://ideone.com/Nb1H3R) –
像注意到其他的答案,這是不可能的內置類型但你能得到這個自定義類型的工作,像這樣(最小的代碼示例):
#include <cmath>
#include <iostream>
struct dummy;
struct Int
{
int i;
Int() : i(0) {}
Int(const int& i) : i(i) {}
dummy operator*();
};
struct dummy
{
Int* p;
dummy(Int* const p) : p(p) {}
int& operator*()
{
return p->i;
}
};
dummy Int::operator*()
{
return dummy(this);
}
int operator*(const Int& lhs, const dummy& rhs)
{
return std::pow(lhs.i, rhs.p->i);
}
int main()
{
Int a(2);
Int b(2);
std::cout<< a ** b << std::endl;
}
[類似的方式](http://pastebin.com/6fd5FTp4) – poorva
@poorva:實際上看起來比我的版本更清潔。好一個 ! – user1233963
- 1. 在C#中定義新的運算符?
- 2. C++ ::運算符定義
- 3. 定義[] =運算符
- 4. 自定義索引運算符C++
- 5. C++自定義運算符新
- 6. 在基類中的運算符定義
- 7. 在C#中使用運算符構造自定義表達樹
- 8. 如何在C中添加或重新定義運算符?
- 9. 如何在C#3.5的超類中定義cast運算符?
- 10. 在C++中定義類似Matlab的。*運算符?
- 11. 是否有可能在C#中自定義運算符?
- 12. 歧義運算符[]綁定
- 13. 定義運算符()函數
- 14. 如何定義運算符= =
- 15. 定義自定義掃描運算符
- 16. 重新定義已定義類型的單個運算符。 C++
- 17. 運算符[&]在C++
- 18. 運算符()在C++
- 19. 定時運算符+,運算符,運算符*和運算符/
- 20. haskell中的自定義concat(++)運算符
- 21. 序言中綴運算符定義
- 22. OCaml重新定義中綴運算符
- 23. 有關在運算符重載定義
- 24. :c/C++中的運算符
- 25. C中前綴運算符的未定義輸出
- 26. C++和運算符中的自定義向量和矩陣類[]
- 27. 運算符在類之外重載定義 - C++
- 28. 未定義的運算符<< ....是指什麼?在c + +
- 29. 如何在C++頭文件外定義賦值運算符?
- 30. C++運算符 ''
http://www.stroustrup.com/bs_faq2.html#overload-operator –
只需使用[pow](http://www.cplusplus.com/reference/cmath/pow/) – Inverse