Как инициализировать статический std :: unordered_map черты типа?

Учитывая следующую черту типа, как я могу инициализировать Fields с некоторыми std::pairs?

template <>
struct ManagerDataTrait<Person>
{
static const std::unordered_map<std::string, std::string> Fields;
// ...
};

Я пытался использовать лямбда, но 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 но это не должно быть главное.

10

Решение

Ответ Керрека С.Б. был бы правильным ответом в целом:

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();

Лямбда — это просто синтаксический сахар для того же, и я не уверен, что использовать лямбду понятнее, потому что синтаксис немного страшнее.

10

Другие решения

Вы понимаете, что можете инициализировать карты из списков?

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

Visual C ++ теперь поддерживает статическую инициализацию из фигурных списков, так что вы можете сделать что-то вроде этого:

const std::unordered_map<std::string, std::string> ManagerDataTrait<Person>::Fields{ { "abc", "xyz" }, { "cde", "zyx" } ...};
2
По вопросам рекламы [email protected]