鉴于以下类型特征,我如何使用Fields
个来初始化std::pair
?
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;
};
如果在traits中无法使用这样的静态成员,我必须将这些信息存储在特征中吗? (Fields
包含SQL数据库结构。)
更新:该成员可能也是const
,但这不应该是重点。
答案 0 :(得分:21)
您意识到可以从支撑列表初始化地图吗?
std::unordered_map<std::string, std::string> m { { "a", "bc" }
, { "b", "xy" }
// ...
};
答案 1 :(得分:10)
Kerrek SB的答案通常是正确答案:
const std::unordered_map<std::string, std::string> ManagerDataTrait<Person>::Fields{
{ "blah", "blah" }
// ...
};
(N.B。没有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更清楚,因为语法有点丑陋。
答案 2 :(得分:2)
Visual C ++现在支持从支持列表中进行静态初始化,因此您可以执行以下操作:
const std::unordered_map<std::string, std::string> ManagerDataTrait<Person>::Fields{ { "abc", "xyz" }, { "cde", "zyx" } ...};