panda3
Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору say24 1. Шаблоны используются для выбора алгоритма при компиляции. При работе программы для этих целей нужно использовать виртуальные функциии или операторы ветвления. 2. Какой ты хочешь иметь тип выражения: Код: MyConteiner_Level_3->GetElement[i]->GetElement[j]->GetElement[k] | ? Не изобретая велосипеда, можно, например, состряпать нечто вроде: Код: #include "boost/variant.hpp" class RecursiveContainer; typedef boost::variant<int, double, RecursiveContainer*> TBaseItem; typedef std::vector<RecursiveContainer*> TCont; typedef boost::variant< int*, double*, TCont > TItem; class RecursiveContainer { TItem ArrayOfData; public: template<class T> RecursiveContainer(T* PointerToData) : ArrayOfData(PointerToData) {} RecursiveContainer() : ArrayOfData(TCont()) {} void push_back(RecursiveContainer* item) { boost::get<TCont>(ArrayOfData).push_back(item); } class getter : public boost::static_visitor<TBaseItem> { int idx; public: getter(int i) : idx(i) {} template<class T> TBaseItem operator()(T p) const { return TBaseItem(p[idx]); } }; TBaseItem GetElement(int i) { return boost::apply_visitor(getter(i), ArrayOfData); } RecursiveContainer* GetSubContainer(int i) { return boost::get<RecursiveContainer*>(GetElement(i)); } }; double ArrayOfDouble[] = {0.1, 0.5, 1.5}; int ArrayOfInt[] = {100, 1, -20}; RecursiveContainer Level1_int(ArrayOfDouble), Level1_double(ArrayOfInt), Level2_1, Level2_2, Level3; Level2_1.push_back(&Level1_int); Level2_1.push_back(&Level1_double); Level2_2.push_back(&Level1_double); Level2_2.push_back(&Level1_int); Level3.push_back(&Level2_1); Level3.push_back(&Level2_2); std::cout << Level3.GetSubContainer(0)->GetSubContainer(0)->GetElement(0) << std::endl; // 0.1 std::cout << Level3.GetSubContainer(1)->GetSubContainer(0)->GetElement(0) << std::endl; // 100 |
|