Я ищу хорошее решение, как инициализировать статический boost::array
с пользовательской структурой пользователя и данными. Мой пример, что я ожидаю от boost::array
ниже:
struct Foo
{
std::string a;
std::string b;
};
static boost::array< Foo, 2 > foo =
{
{ "111", "222" },
{ "333", "444" },
};
Но этот код не работал,
error C2078: too many initializers
Что мне не хватает?
Thnks!
Это связано с тем, как работает скобка. От N3485, 8.5.1.11:
Брекеты могут быть исключены в инициализатора-лист следующее. Если инициализатора-лист начинается с левой фигурной скобки, затем следующий список разделенных запятыми инициализатора-статьи инициализирует членов субагрегата; ошибочно быть более инициализатора-статьи чем участники. Если, однако, инициализатора-лист для субагрегата не начинается с левой скобки, то достаточно только инициализатора-статьи из списка берутся для инициализации члены субагрегата; любой оставшийся инициализатора-статьи оставлены для инициализации следующего члена агрегата, членом которого является текущий субагрегат.
Другими словами, если следующая вещь — это список инициализаторов, мы можем предположить, что исключение скобок не произошло. Скобки вставляются на самом внутреннем уровне, и поэтому пока мы бы хотели следующее
{{"a", "b"}, {"c", "d"}} -> {{{"a", "b"}, {"c", "d"}}}
вместо этого мы получаем
{{"a", "b"}, {"c", "d"}} -> {{{"a", "b"}}, {"c", "d"}}
Теперь о том, почему мы можем исключить еще больше фигурных скобок и написать {"a", "b", "c", "d"}
: как только мы попали в "a"
мы знаем, что удаление скобки произошло, так как мы ожидаем, что член массива будет инициализирован списком инициализаторов. Таким образом, мы начинаем использовать столько инициализирующих предложений, сколько необходимо для инициализации массива-члена. Опять мы попали "a"
вместо списка инициализатора, и поэтому мы начинаем использовать столько инициализаторов, сколько необходимо для инициализации первого Foo
, Мы повторяем это для второго Foo
, потреблять все пункты, и в конечном итоге
{"a", "b", "c", "d"} -> {{{"a", "b"}, {"c", "d"}}}
по желанию.
Добавление дополнительного набора скобок работает для меня.
static boost::array< Foo, 2 > foo =
{{
{ "111", "222" },
{ "333", "444" },
}};
Больше, как я понимаю, почему. Я думаю, что ключ здесь — это «Брейс элис» (спасибо jesyspa за указание на меня)
Это также работает:
static boost::array< Foo, 2 > foo =
{
"111", "222",
"333", "444",
};