dan*_*jar 10 c++ unordered-map static-members type-traits template-specialization
鉴于以下类型特征,我如何初始化Fields一些std::pair s?
template <>
struct ManagerDataTrait<Person>
{
static const std::unordered_map<std::string, std::string> Fields;
// ...
};
Run Code Online (Sandbox Code Playgroud)
我尝试使用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;
};
Run Code Online (Sandbox Code Playgroud)
如果没有办法在特征中使用这样的静态成员,我必须将这些信息存储在特征中吗?(Fields拥有SQL数据库结构.)
更新:成员可能也是,const但这不应该是重点.
Ker*_* SB 21
您意识到可以从支撑列表初始化地图?
std::unordered_map<std::string, std::string> m { { "a", "bc" }
, { "b", "xy" }
// ...
};
Run Code Online (Sandbox Code Playgroud)
Jon*_*ely 10
Kerrek SB的答案通常是正确答案:
const std::unordered_map<std::string, std::string> ManagerDataTrait<Person>::Fields{
{ "blah", "blah" }
// ...
};
Run Code Online (Sandbox Code Playgroud)
(注意,不,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();
Run Code Online (Sandbox Code Playgroud)
lambda只是做同样事情的语法糖,我不确定使用lambda更清楚,因为语法有点丑陋.
| 归档时间: |
|
| 查看次数: |
21874 次 |
| 最近记录: |