6

鑑於以下類型特徵,我如何初始化Fields以及一些std::pair如何初始化類型特徵的靜態std :: unordered_map?

template <> 
struct ManagerDataTrait<Person> 
{ 
    static const std::unordered_map<std::string, std::string> Fields; 
    // ... 
}; 

我試圖用一個lambda但Visual Studio中說,Fields是不是可以明確專門的實體。

template <> 
const std::unordered_map<std::string, std::string> ManagerDataTrait<Person>::Fields = []{ 
    std::unordered_map<std::string, std::string> fields; 
    fields.insert(std::make_pair("height", "FLOAT")); 
    fields.insert(std::make_pair("mass", "FLOAT")); 
    return fields; 
}; 

如果沒有辦法使用特性靜態成員是這樣,它的替代品我必須存儲在性狀的信息? (Fields擁有SQL數據庫結構。)

更新:成員也可能是const但這不應該是重點。

+0

爲了您的拉姆達工作的東西就需要實際_run_拉姆達,但你還沒有嘗試這樣做(你剛剛試圖從lambda構造哈希映射,這是無效的,但肯定不會運行lambda。) –

回答

7

Kerrek SB的回答將是一般正確的答案:

const std::unordered_map<std::string, std::string> ManagerDataTrait<Person>::Fields{ 
    { "blah", "blah" } 
    // ... 
}; 

(NB沒有template<>因爲你定義一個專門的成員,而不是一個特例)

但是,不受Visual C++支持,因此另一種方法是使用函數調用初始化映射,並從函數返回具有所需內容的映射:

std::unordered_map<std::string, std::string> 
getFields() 
{ 
    std::unordered_map<std::string, std::string> fields; 
    fields["blah"] = "blah"; 
    // ... 
    return fields; 
} 

const std::unordered_map<std::string, std::string> ManagerDataTrait<Person>::Fields = getFields(); 

lambda只是語法糖做同樣的事情,我不確定使用lambda表達式更清晰,因爲語法有點醜。

16

你意識到你可以從支撐列表初始化地圖?

std::unordered_map<std::string, std::string> m { { "a", "bc" } 
               , { "b", "xy" } 
//            ... 
               }; 
+0

解決方案是擺脫你指出的'template <>'在一個現在刪除的評論。你能否把這個添加到你的答案?我會將它標記爲已接受。 – danijar

+0

我提出(並刪除)了這樣的評論,是你指的那個? –

+0

@JonathanWakely你是對的,我的意思是你的評論。我把它混在一起。 – danijar

0

的Visual C++現在支持從支撐名單靜態初始化,所以你可以做這樣的事情:

const std::unordered_map<std::string, std::string> ManagerDataTrait<Person>::Fields{ { "abc", "xyz" }, { "cde", "zyx" } ...}; 
相關問題