@demetor

С++. Создание динамического массива, хранящего типы данных как элементы массива. Возможно ли каким-либо образом?

Нужен механизм, позволяющий создать для программы словарь на основе двухмерного динамического массива, где <Имя типа данных (строка), тип данных>. На месте "тип данных" может быть указатель на функцию, создающую этот тип данных, адрес объекта-прототипа, или что угодно, что позволит получить нужный тип данных, при обращении к элементу массива.
Нужно это все для механизма трансляции кода, передаваемого строками во время выполнения программы, при чем этот код должен иметь возможность вызывать члены существующих в программе классов. Хочется избежать создания огромных функций, где будут описываться все типы данных и механизм их обработки.
Предпочтительно сделать, например, универсальный глобальный класс TypeCollector, который позволит в конструкторе любого нового класса просто добавить тип данных создаваемого класса в TypeCollector, а после создать объект сохраненного типа данных из другой точки кода через соответствующий метод класса TypeCollector.
  • Вопрос задан
  • 178 просмотров
Решения вопроса 1
@vanyamba-electronics
class IObject
{
public:
   virtual void create(void** ret_val) = 0;
   virtual std::string name() const = 0;
};

template <typename _Type>
class ObjectT : public IObject
{
protected:
    static std::string m_name;
public:
    void create(void** ret_val)
    {
        *ret_val = (void*) new _Type;
    }
};

typedef ObjectT<bool> BoolObject;
typedef ObjectT<int>    IntObject;

template<> std::string BoolObject::m_name = "bool";
template<> std::string IntObject::m_name = "int";

BoolObject bobj;
IntObject iobj;
std::vector<IObject*> my_vector;
my_vector.push_back (&bobj);
my_vector.push_back (&iobj);

if (my_vector[n].name() == "bool") {
   bool* pval = nullptr;
   my_vector[n].create((void**) &pval);
   *pval = true;
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Adamos
@Adamos
Фабрика объектов единообразно создает классы, у которых единообразный интерфейс.
Вам нужно наделать классов, которые принимают строку значения и строку типа, обрабатывают их и ведут себя снаружи совершенно одинаково. Тогда то, что у них внутри обрабатываются данные разных типов, не будет иметь значения, и экземпляры таких классов можно будет собрать, например, в map с ключом-строкой, в которой будет тип.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы