[英]What is this "operator" block of code in c++ class
我將某人的 class 用於位圖,這是在 64 位位集中存儲國際象棋位置的方法。 我想知道auto() operator
的部分是做什么的。 使用“auto”是因為它返回一位,這就是為什么沒有為 function 指定返回類型的原因嗎? 我知道它會檢查 x 和 y 是否在棋盤的邊界內,如果不在則斷言錯誤。 我也明白它返回一個對應於位集的 x,y 值對的位。 我也不明白為什么 function 是這樣定義的,帶有一對額外的括號。 任何幫助表示贊賞!
class BitBoard {
private:
std::bitset<64> board;
public:
auto operator()(int x, int y) {
assert(0<=x && x<=7);
assert(0<=y && y<=7);
return board[8*y+x];
}
}
};
“額外的”一對括號是因為您正在定義operator()
,它讓您的 class 的實例表現得像函數。 所以如果你有一個:
BitBoard board;
您可以通過以下方式獲得x=3
和y=5
的值:
board(3, 5)
而不是在板上顯式調用方法,例如board.get_bit_at(3, 5)
。
使用auto
只是意味着它從std::bitset<64>
的operator[]
推導出返回類型; 由於該方法不是const
限定的,這意味着它只是推導std::bitset::reference
類型, std::bitset
的operator[]
使用它來允許通過諸如mybitset[5] = true;
,即使您不能為單個位提供“真實”引用。 如果第二次重新實現為const
限定的operator()
,例如:
auto operator()(int x, int y) const {
assert(0<=x && x<=7);
assert(0<=y && y<=7);
return board[8*y+x];
}
您可以再次使用auto
來保持一致性,盡管它不會節省任何復雜性(在這種情況下,返回類型將為bool
,匹配std::bitset
的const
限定的operator[]
,輸入起來並不比auto
難)。
選擇使用operator()
是多維數據結構繞過operator[]
只接受一個參數的老辦法; 不是定義operator[]
來返回代理類型(它本身實現了另一個operator[]
以啟用對第二維的訪問),而是定義operator()
來獲取任意數量的 arguments 並有效地執行完整查找而無需代理.
operator()
是 function 的名稱,后面跟着另一對列出 arguments 的括號。它是函數調用運算符,重載它可以使對象的行為類似於函數/函數指針。 在這種情況下,它允許:
BitBoard thing;
thing(i, j); // looks like a function!
在這種特殊情況下,它被用於索引(如a[i]
),但下標運算operator[]
不允許多個索引,而函數調用運算符允許。 因此,對於多維 arrays,這種情況很常見。
但是,C++ 中多個索引的新“首選”樣式是將列表傳遞給下標運算符:
BitBoard thing;
std::cout << thing[{i, j}];
這將通過operator[](std::array<int, 2> xy)
來完成。
但是這個 class 的作者選擇了老方法,看起來像 function 調用。
重載operator()
也是使 lambda 表達式在內部打勾的原因。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.