簡體   English   中英

c++ class 中的這個“運算符”代碼塊是什么

[英]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=3y=5的值:

board(3, 5)

而不是在板上顯式調用方法,例如board.get_bit_at(3, 5)

使用auto只是意味着它從std::bitset<64>operator[]推導出返回類型; 由於該方法不是const限定的,這意味着它只是推導std::bitset::reference類型, std::bitsetoperator[]使用它來允許通過諸如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::bitsetconst限定的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM