【问题标题】:How to initialize a static std::unordered_map of a type trait?如何初始化类型特征的静态 std::unordered_map?
【发布时间】:2013-11-03 21:27:15
【问题描述】:

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

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

【问题讨论】:

  • 要让你的 lambda 工作,需要真正运行 lambda,但你还没有尝试这样做(你只是尝试从lambda,它是无效的,但肯定不会运行 lambda。)

标签: c++ static-members template-specialization unordered-map typetraits


【解决方案1】:

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

std::unordered_map<std::string, std::string> m { { "a", "bc" }
                                               , { "b", "xy" }
//                                               ...
                                               };

【讨论】:

  • 解决方案是删除您在现已删除的评论中指出的template &lt;&gt;。您能否将此添加到您的答案中?到时候我会把它标记为已接受。
  • 我发表了(并删除了)这样一条评论,你说的是这个吗?
  • @JonathanWakely 你是对的,我的意思是你的评论。我把它弄混了。
【解决方案2】:

Kerrek SB 的答案通常是正确的答案:

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

(注意没有template&lt;&gt;,因为您定义的是专业化的成员,而不是专业化)

但这不受 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 是否更清晰,因为语法有点丑。

【讨论】:

    【解决方案3】:

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

    const std::unordered_map<std::string, std::string> ManagerDataTrait<Person>::Fields{ { "abc", "xyz" }, { "cde", "zyx" } ...};
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多