簡體   English   中英

C ++靜態結構模板方法返回枚舉類型

[英]C++ static struct template method to return enum type

我不是很了解c ++,但是我已經花了一段時間了,盡管我知道我應該花些時間來學習它。

無論如何,我這里的問題是靜態結構,我不確定它的結構是否正確。

enum ItemTypes_t {  
    ITEM_TYPE_KEY,
    ITEM_TYPE_MAGICFIELD,
    ITEM_TYPE_DEPOT,
    ITEM_TYPE_REWARDCHEST,
    ITEM_TYPE_MAILBOX,
    ITEM_TYPE_TRASHHOLDER,
    ITEM_TYPE_TELEPORT,
    ITEM_TYPE_DOOR,
    ITEM_TYPE_BED,
    ITEM_TYPE_RUNE
};

template <typename T>
static struct tTypes {
public:
    const char* name;
    T value;
    T getEnums(std::string itemName);
};

tTypes<ItemTypes_t>itemEnum[] = {
    { "key", ITEM_TYPE_KEY },
    { "magicfield", ITEM_TYPE_MAGICFIELD },
    { "depot", ITEM_TYPE_DEPOT },
    { "rewardchest", ITEM_TYPE_REWARDCHEST },
    { "mailbox", ITEM_TYPE_MAILBOX },
    { "trashholder", ITEM_TYPE_TRASHHOLDER },
    { "teleport", ITEM_TYPE_TELEPORT },
    { "door", ITEM_TYPE_DOOR },
    { "bed", ITEM_TYPE_BED },
    { "rune", ITEM_TYPE_RUNE }
};

ItemTypes_t tTypes<ItemTypes_t>::getEnums(std::string itemName) {
    for (int i = 0; itemEnum[i].name; i++) {
        if (itemEnum[i].name == find) {
            return itemEnum[i].value;
        }
    }
    return;
};

我這樣創建它的一個實例。

tTypes<ItemTypes_t> itemType = tTypes<ItemTypes_t>();

然后這樣稱呼它。

ItemTypes_t storage;

storage = itemType.getEnums("some item name is passed here as a string");

沒有錯誤,但我真的不了解該結構,甚至不知道它是否可以工作。

編輯:這是一些錯誤

error C2988: unrecognizable template declaration/definition
error C2059: syntax error: '<end Parse>'
error C2977: 'tTypes': too many template arguments
note: see declaration of 'tTypes'
error C2977: 'tTypes': too many template arguments
note: see declaration of 'tTypes'
error C2027: use of undefined type 'tTypes'
note: see declaration of 'tTypes'
error C2027: use of undefined type 'tTypes'
note: see declaration of 'tTypes'
error C2027: use of undefined type 'tTypes'
note: see declaration of 'tTypes'
error C2561: 'getEnums': function must return a value
note: see declaration of 'getEnums

我嘗試使用地圖,但沒有用

std::map<std::string, ItemTypes_t> tTypes = {
    { "key", ITEM_TYPE_KEY },
    { "magicfield", ITEM_TYPE_MAGICFIELD },
    { "depot", ITEM_TYPE_DEPOT },
    { "rewardchest", ITEM_TYPE_REWARDCHEST },
    { "mailbox", ITEM_TYPE_MAILBOX },
    { "trashholder", ITEM_TYPE_TRASHHOLDER },
    { "teleport", ITEM_TYPE_TELEPORT },
    { "door", ITEM_TYPE_DOOR },
    { "bed", ITEM_TYPE_BED },
    { "rune", ITEM_TYPE_RUNE },
};

編輯2:

我在線使用了c ++編譯器來測試我認為它應該如何工作並且可以正常工作(地圖),但是當我在項目中嘗試時,它根本無法工作。

這只是一個非常基本的例子。

#include <iostream>
#include <map>

using namespace std;

enum a : unsigned int {
    RED = 23, BLACK = 43, BLUE = 56
};

map<string, a> colors = {
    {"black", BLACK},
    {"green", RED},
    {"yellow", BLUE}
};

int main()
{
   cout << "test map " << colors["green"] << endl; 

   return 0;
}

這是結果

sh-4.3$ g++ -std=c++11 -o main *.cpp                                                                                                                                
sh-4.3$ main                                                                                                                                                        
test map 23 

感謝大家的建議,問題不在於地圖還是地圖工作正常。.我試圖用靜態結構模板構造的怪獸顯然是錯誤的。

真正的問題是從哪里讀取字符串。

我只是解釋一下,通常這些數據是從xml文件中讀取的,但是我構造了一些代碼以通過xml文件的解析生成lua表,以便我可以重新編寫函數以加載存在問題的lua表嵌套錯誤,所以這就是為什么我要使用地圖,實際上是幾個。

我已經工作了幾個小時,所以可以自然地查看某些東西,代碼中的字符串也沒問題,映射也沒有問題,它的lua文件,其某些屬性是不同的字符大小寫。地圖的索引,即使是相同的拼寫單詞,也具有不同的字符大小寫。

解:

對於我來說,最簡單的解決方案是在構建lua表時將屬性小寫。

結論:

那行得通,而不是真正的50k未讀屬性,現在我只剩下20或30個未讀屬性。.謝謝大家的幫助,我一定會看看那些書的!

您可以這樣定義您的getEnums函數:

ItemTypes_t tTypes<ItemTypes_t>::getEnums(std::string itemName) { ... }

但是,這不是定義模板類的成員函數的方式。 這是一種專門化 ,您不能專門化模板結構的單個成員,而必須專門化整個結構。

你應該做

template<typename T>
T tTypes<T>::getEnums(std::string itemName) { ... }

您還應該注意其他事項。 就像字符串和枚舉值之間的映射一樣,應該將其作為構造函數的參數傳遞給tTypes類,並內部存儲在該類內部。

您的代碼可以使用std :: map並使用singleton類來實現,如下所示:

#include <map>
#include <string>

enum class repo_t {ITEM_TYPE_MAGICFIELD,ITEM_TYPE_DEPOT}; //etc

class repo
{
   private:
     std::map<std::string,repo_t> items;
     repo()
     {
     items.insert(std::make_pair("magicfield", repo_t::ITEM_TYPE_MAGICFIELD));
     items.insert(std::make_pair("depot", repo_t::ITEM_TYPE_DEPOT ));
     items.insert(std::make_pair("rewardchest",repo_t::ITEM_TYPE_REWARDCHEST ));
         //etc
      } 

   public:

   static repo*& get_instance()
    {
        static repo* obj(new repo());
        return obj;
    }

    ~repo(){}

    bool find(std::string key, repo_t& result)
    {
       auto it = items.find(key);
       if(it ==  items.end())
             return false;
       result = *it;
       return true;
    }


};

//usage

void main()
{
    repo_t result;
    bool found = repo::get_instance()->find("magicfield",result);
    if(found)
    {
       // do something with result
    }
    else
    {
      // key not found
    }


}

暫無
暫無

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

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