Учитывая следующую черту типа, как я могу инициализировать Fields
с некоторыми std::pair
s?
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
но это не должно быть главное.
Ответ Керрека С.Б. был бы правильным ответом в целом:
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();
Лямбда — это просто синтаксический сахар для того же, и я не уверен, что использовать лямбду понятнее, потому что синтаксис немного страшнее.
Вы понимаете, что можете инициализировать карты из списков?
std::unordered_map<std::string, std::string> m { { "a", "bc" }
, { "b", "xy" }
// ...
};
Visual C ++ теперь поддерживает статическую инициализацию из фигурных списков, так что вы можете сделать что-то вроде этого:
const std::unordered_map<std::string, std::string> ManagerDataTrait<Person>::Fields{ { "abc", "xyz" }, { "cde", "zyx" } ...};