簡體   English   中英

如何根據 char 數組檢索枚舉索引值? 在 C++ (cpp)

[英]How to retrieve an enum index value based on char array? in C++ (cpp)

免責聲明:編程新手,即時學習。 這是我的第一篇文章,如果問題沒有寫清楚,我深表歉意。

我正在嘗試通過有關構建國際象棋引擎的教程來 go,但它是用 C 編寫的,我正在嘗試將其轉換為 C++ 代碼。 代碼的想法是輸入一個字符並檢索枚舉的索引值。 由於此代碼,我收到編譯錯誤。 我該如何解決這個問題,因為在嘗試不同的想法后我不清楚。

例如std::cout << CHAR_TO_PIECE['k']; 預期 output 為 11。

"typedefs.h"

enum Piece {P, N, B, R, Q, K, p, n, b, r, q, k};

"board.h"

extern const int CHAR_TO_PIECE[];

並在board.c

// convert ASCII character pieces to encoded constants
int CHAR_TO_PIECE[] = {
    ['P'] = P,
    ['N'] = N,
    ['B'] = B,
    ['R'] = R,
    ['Q'] = Q,
    ['K'] = K,
    ['p'] = p,
    ['n'] = n,
    ['b'] = b,
    ['r'] = r,
    ['q'] = q,
    ['k'] = k
};

處理此問題的更多 C++ 方法是使用std::map (或std::unordered_map ),例如:

#include <map>

enum Piece {P, N, B, R, Q, K, p, n, b, r, q, k};

extern const std::map<char, Piece> CHAR_TO_PIECE;
// convert ASCII character pieces to encoded constants
const std::map<char, Piece> CHAR_TO_PIECE = {
    {'P', P},
    {'N', N},
    {'B', B},
    {'R', R},
    {'Q', Q},
    {'K', K},
    {'p', p},
    {'n', n},
    {'b', b},
    {'r', r},
    {'q', q},
    {'k', k}
};
std::cout << (int) CHAR_TO_PIECE['k'];

您可以編寫一個 function 來為您的字符輸入返回特定的枚舉。

enum Piece {P, N, B, R, Q, K, p, n, b, r, q, k};

Piece charToPiece(char ch)
{
    switch (ch) {
        case 'P':
            return P;
        case 'N':
            return N;
        case 'B':
            return B;
        case 'R':
            return R;
        case 'Q':
            return Q;
        case 'K':
            return K;
        case 'p':
            return p;
        case 'n':
            return n;
        case 'b':
            return b;
        case 'r':
            return r;
        case 'q':
            return q;
        case 'k':
            return k;
    }
}

您可以創建一個包含 2 x 26 個條目(大寫和小寫)的枚舉數組,並為每個相關條目分配正確的枚舉。 這必須手動編碼。 有了這樣的對應表,字符查找是立即的。 (如果需要,您還可以保留“未分配”值。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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