1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
| using namespace std;
enum Type { T_INT, T_FLOAT, T_STRING };
struct Data;
struct Loop;
typedef boost::variant<Data, Loop> variant_type;
typedef boost::variant<int, float, string> data_type;
struct Data {
explicit Data(int d): type(T_INT), data(d) { }
explicit Data(float d): type(T_FLOAT), data(d) { }
explicit Data(const string& d): type(T_STRING), data(d) { }
Type type;
data_type data;
};
struct Loop { map<string, variant_type> loopData; };
void print(Data& data) {
switch(data.type) {
case T_INT: cout << "int: "; break;
case T_FLOAT: cout << "float: "; break;
case T_STRING: cout << "string: "; break;
default:
break;
}
cout << data.data << endl;
}
Data getData(const Loop& l, const initializer_list<string> where, string name) {
// Data getData(const Loop& l, const initializer_list<string>& where, string name) {
// donne :
// fatal error C1001: An internal error has occurred in the compiler.
// 1> (compiler file 'msc1.cpp', line 1453)
const Loop *pl = &l;
for(const auto& str: where) {
pl = &boost::get<Loop>(pl->loopData.find(str)->second);
}
return boost::get<Data>(pl->loopData.find(name)->second);
}
int main() {
Loop m0;
m0.loopData.insert(make_pair("1", Data(1)));
m0.loopData.insert(make_pair("2", Data(2.f)));
m0.loopData.insert(make_pair("3", Data("3")));
Loop m1;
m1.loopData.insert(make_pair("4", Data(4)));
m1.loopData.insert(make_pair("5", Data(5.f)));
m1.loopData.insert(make_pair("6", Data("6")));
Loop m0_0;
m0_0.loopData.insert(make_pair("7", Data(7)));
m0_0.loopData.insert(make_pair("8", Data(8.f)));
m0_0.loopData.insert(make_pair("9", Data("9")));
m0.loopData.insert(make_pair("m0_0", m0_0));
Loop l;
l.loopData.insert(make_pair("m0", m0));
l.loopData.insert(make_pair("m1", m1));
auto d = getData(l, {"m0", "m0_0"}, "7");
print(d);
return 0;
} |
Partager