Я пытаюсь сделать что-то похожее на std :: Map. У меня есть два класса, NameValue, который принимает имя и значение. Класс Value может содержать данные типа int и string. Я хочу, чтобы класс Value также принимал NameValue, чтобы иметь возможность создавать вложенные объекты. В настоящее время boost :: variable используется для хранения разрешенных к использованию типов данных.
NameValue.h
#ifndef INC_NAME_VALUE_H_
#define INC_NAME_VALUE_H_
#include <boost/variant.hpp>
#include <iostream>
#include <string>
#include "value.h"
namespace config {
using namespace std;
class Value; // forward declaration
class NameValue {
private:
string name;
Value* valuePtr;
public:
NameValue(){};
NameValue(string name, Value& value)
: name(name)
, valuePtr(&value){};
void Print() {
cout << name << " : ";
// valuePtr->Print();
}
void Set(Value* value) { valuePtr = value; }
};
}
#endif /* INC_NAME_VALUE_H_ */
Value.h
#ifndef INC_VALUE_H_
#define INC_VALUE_H_
#include <boost/variant.hpp>
#include <iostream>
#include <string>
#include "name_value.h"
namespace config {
using namespace std;
using variantDataType = boost::variant<int, string>;
class Value {
private:
variantDataType value;
public:
Value(){};
Value(variantDataType const& value)
: value(value){};
void Print() { cout << value << endl; }
};
}
#endif /* INC_VALUE_H_ */
В Value.h я хочу добавить NameValue к варианту, подобному этому:
boost::variant<int,string,NameValue> value;
main.cpp
Value i(42);
NameValue nv("meaning", i);
NameValue nv2("nested, NameValue("deep", "value"));//this is what I want
Может быть, я не на том пути, используя вариант или то, как я использую зависимости. Если есть какой-то другой способ заставить это работать, я был бы признателен за предложения.