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" } ...}; 
相关问题