Вы должны указать yaml-cpp
, как анализировать этот тип.Поскольку C ++ не динамически типизирован, он не может определить, какой тип данных вы хотите, и создать его с нуля - вы должны указать это напрямую.Пометка узла действительно только для вас, а не для парсера (он просто будет верно хранить его для вас).
Я не совсем уверен, как хранится матрица OpenCV, но если это что-то вроде этого:
class Matrix {
public:
Matrix(unsigned r, unsigned c, const std::vector<float>& d): rows(r), cols(c), data(d) { /* init */ }
Matrix(const Matrix&) { /* copy */ }
~Matrix() { /* delete */ }
Matrix& operator = (const Matrix&) { /* assign */ }
private:
unsigned rows, cols;
std::vector<float> data;
};
тогда вы можете написать что-то вроде
void operator >> (const YAML::Node& node, Matrix& matrix) {
unsigned rows, cols;
std::vector<float> data;
node["rows"] >> rows;
node["cols"] >> cols;
node["data"] >> data;
matrix = Matrix(rows, cols, data);
}
Edit Похоже, что вы в порядке, пока здесь;но вы пропускаете шаг, когда парсер загружает информацию в YAML::Node
.Вместо этого, введите:
std::ifstream fin("monsters.yaml");
YAML::Parser parser(fin);
YAML::Node doc;
parser.GetNextDocument(doc); // <-- this line was missing!
Matrix m;
doc["tableCenter"] >> m;
Примечание: я предполагаю, что dt: f
означает "тип данных является плавающим".Если это так, то это будет зависеть от того, как класс Matrix
справится с этим.Если у вас есть разные классы для каждого типа данных (или шаблонный класс), вам придется прочитать это поле сначала , а затем выбрать тип для создания экземпляра.(Если вы знаете , он всегда будет плавать, что, конечно, облегчит вашу жизнь.)