12

鉴于以下类型特征,我如何Fields使用一些std::pairs 进行初始化?

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,但这不应该是重点。

4

3 回答 3

27

你意识到你可以从花括号列表中初始化地图吗?

std::unordered_map<std::string, std::string> m { { "a", "bc" }
                                               , { "b", "xy" }
//                                               ...
                                               };
于 2013-11-03T21:32:14.023 回答
11

一般而言,Kerrek SB 的答案是正确的答案:

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

(注意不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 是否更清晰,因为语法有点丑陋。

于 2013-11-03T22:00:02.750 回答
2

Visual C++ 现在支持从花括号列表进行静态初始化,因此您可以执行以下操作:

const std::unordered_map<std::string, std::string> ManagerDataTrait<Person>::Fields{ { "abc", "xyz" }, { "cde", "zyx" } ...};
于 2015-06-15T22:13:49.827 回答