Ладно, это было легко, и я идиот, потому что я не стараюсь больше.Я не буду отмечать это как ответ в случае, если кто-то публикует лучший ответ.
Я расширил ответ, чтобы приспособить матрицы любого измерения (предполагается, что вы добавляете атрибут Size="M N"
к узлу).
Ответ на оригинальный вопрос
std::stringstream iss(
tree.get_child("Root.ChildArray")
.data() // string
);
float number = 0;
for (size_t i = 0; i < 3; i++)
if (iss >> number)
_data[i] = number;
Расширенный ответ
Здесь я добавляю проверку атрибута для чтения измерений (обратите внимание, что это можно улучшить, особенно для большего количества измерений, и этокаждый по-прежнему использует array<float,3>
вместо полностью динамического контейнера).
// probably can be done in a more elegant way
std::stringstream iss(
tree.get<std::string>("Root.ChildArray.<xmlattr>.Dimensions")
);
size_t M = 0;
iss >> M;
// *********
iss.str(
tree.get_child("Root.ChildArray")
.data()
);
_data.resize(M);
float number = 0;
for (size_t row = 0; row < M; row++)
{
for (size_t col = 0; col < 3; col++)
{
if (iss >> number)
{
_data[row][col] = number;
}
}
}
Попробуйте использовать следующий XML:
<?xml version="1.0" ?>
<Root>
<ChildArray Dimensions="2 3">
1.0 0.0 -1.0
0.0 0.4 1.0
</ChildArray>
</Root>