如何初始化类型特征的静态std :: unordered_map?

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更清楚,因为语法有点丑陋.