Как инициализировать boost :: array с пользовательской структурой?

Я ищу хорошее решение, как инициализировать статический 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!

0

Решение

Это связано с тем, как работает скобка. От 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"}}}

по желанию.

3

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

Добавление дополнительного набора скобок работает для меня.

 static boost::array< Foo, 2 > foo =
{{
{ "111", "222" },
{ "333", "444" },
}};

Больше, как я понимаю, почему. Я думаю, что ключ здесь — это «Брейс элис» (спасибо jesyspa за указание на меня)

Это также работает:

 static boost::array< Foo, 2 > foo =
{
"111", "222",
"333", "444",
};
1

По вопросам рекламы [email protected]