[英]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.