Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
 Аватар для pgb
-508 / 32 / 0
Регистрация: 22.09.2015
Сообщений: 1,232

Как запомнить тип данных, потом по запомненному типу создать объект?

17.01.2022, 13:40. Показов 2192. Ответов 23
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть примеры или мысли по такому вопросу?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.01.2022, 13:40
Ответы с готовыми решениями:

Получить адрес на переменную\объект, потом от этого адреса создать указатель на объект и изменить значение. Как?
int a=55; uintptr_t adr=&a; int *b=*adr; *b=88; cout << "a=" << a << "b=" << b; Добавлено через 16 минут так...

Как создать объект по его типу, не используя конструктор?
Необходимо создать объект, зная его тип. Activator.CreateInstanc использует конструктор, так что он не подходит.

Как создать объект оператором new, если имеется только тип указателя на объект, переданный через шаблон?
Есть шаблон. Точно известно, что его параметр Т это указатель. Как с помощью new создать переменную типа *T ? Код приведенный ниже дает...

23
фрилансер
 Аватар для Алексей1153
6460 / 5662 / 1130
Регистрация: 11.10.2019
Сообщений: 15,078
17.01.2022, 13:46
pgb, дать типу имя (текстовое или численное). Или использовать заполненный экземпляр std::variant
0
 Аватар для ram876
759 / 456 / 213
Регистрация: 19.12.2016
Сообщений: 1,815
17.01.2022, 14:34
Может свитчем? Правда придется все варианты пересмотреть.
0
 Аватар для pgb
-508 / 32 / 0
Регистрация: 22.09.2015
Сообщений: 1,232
17.01.2022, 15:06  [ТС]
Цитата Сообщение от ram876 Посмотреть сообщение
Может свитчем? Правда придется все варианты пересмотреть.
Для стандартных типов так и сделал, но для пользовательских, тут нужен другой способ.
Цитата Сообщение от Алексей1153 Посмотреть сообщение
дать типу имя (текстовое или численное). Или использовать заполненный экземпляр std::variant
не вариант

Думаю может сделать шаблонную функцию которая будет создавать объект new TYPE, запоминать указатель на эту функцию, а потом вызывать при необходимости.
Экспериментирую пока.
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
17.01.2022, 15:09
C++
1
std::function<void* ()> factory = [] () -> void* { return new MyType(); };
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
17.01.2022, 15:49
C++
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
#include <iostream>
 
template<typename T>
struct holder
{
    template<typename ...Args>
    T create(Args&&... args)
    {
        return T(std::forward<Args>(args)...);
    }
};
 
struct MyType1
{
    int m_value;
    MyType1(int value) : m_value(value){std::cout << "created\n";}
};
 
int main()
{
    // сохранили тип
    holder<MyType1> h1;
    // создали объект
    MyType1 t1 = h1.create(100);
    std::cout << t1.m_value;
}
Так что ли надо?
1
 Аватар для pgb
-508 / 32 / 0
Регистрация: 22.09.2015
Сообщений: 1,232
17.01.2022, 16:00  [ТС]
Цитата Сообщение от Undisputed Посмотреть сообщение
Так что ли надо?
Спасибо, именно так надо.
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,531
Записей в блоге: 1
17.01.2022, 16:02
pgb, в 10 раз повторяю автору, что он выбрал не тот язык для динамического превращения типов данных и мета-информации о типах.
Вот зачем тебе именно С++, автор?
Чем тебе в PHP, Python, JavaScript, C#, (не в курсе как там в Ruby, Lisp но вроде подходят) программирование с динамическими типами не угодило?
Зачем забивать гвозди микроскопом?

Твои вопросы
Как запомнить тип данных, потом по запомненному типу создать объект?
Динамическое создание и удаление объекта
Проверить есть ли метод в объекте
Как определить подключен ли namespace
Макрос добавления значений
Указатель преобразовать в объект
Вложенные шаблоны под определённый тип

отлично решаются в интерпретируемых языках. Зачем зацикливаться на С++? Единственный язык программирования что ли?
0
фрилансер
 Аватар для Алексей1153
6460 / 5662 / 1130
Регистрация: 11.10.2019
Сообщений: 15,078
17.01.2022, 17:05
Цитата Сообщение от pgb Посмотреть сообщение
Спасибо, именно так надо.
ну, и в чем от этого шаблона помощь? Это же банальный using:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
 
struct MyType1
{
    int m_value{};
    MyType1(int value) : m_value(value){std::cout << "created\n";}
};
 
int main()
{
    using h1=MyType1;
 
    h1 t1(100);
    std::cout << t1.m_value;
}
0
 Аватар для pgb
-508 / 32 / 0
Регистрация: 22.09.2015
Сообщений: 1,232
17.01.2022, 18:40  [ТС]
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
в 10 раз повторяю автору, что он выбрал не тот язык
Не можешь помочь, тогда отвали..
Цитата Сообщение от Алексей1153 Посмотреть сообщение
Это же банальный using:
Наверно вы правы. Мало чем помогло.

Мне нужен не шаблонный класс который может присвоить и потом возвратить любой объект.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Any {
template<typename dTYPE>
struct holder {
    template<typename ...Args>
    dTYPE create(Args&&... args){
        return dTYPE(std::forward<Args>(args)...);
    }
};
private:
    void* pnt;
public:
    template<typename dTYPE>
    Any(dTYPE obj){
        holder<dTYPE> hld;
        this->pnt=&hld;
    }
    template <typename dTYPE>
    explicit operator dTYPE() const{return *static_cast<dTYPE*>(this->pnt);}
};
0
фрилансер
 Аватар для Алексей1153
6460 / 5662 / 1130
Регистрация: 11.10.2019
Сообщений: 15,078
17.01.2022, 18:58
Цитата Сообщение от pgb Посмотреть сообщение
не шаблонный класс который может присвоить и потом возвратить любой объект.
тут противоречие в условиях:
если тип разный, то это шаблон. (Либо динамический полиморфизм, что в данном случае не очень вариант)

чтобы отличать типы друг от друга, им нужно дать строковое имя или числовой индекс. Строка - это накладно. А для индекса уже есть готовый класс std::variant (всё равно пришлось бы городить его функциональность вручную). Все нужные типы, конечно, придётся перечислить через запятую
0
 Аватар для pgb
-508 / 32 / 0
Регистрация: 22.09.2015
Сообщений: 1,232
17.01.2022, 19:44  [ТС]
Я сделал класс DIFFERENT это пользовательский тип который может присваивать любое значение любого стандартного типа и возвращать соответственно, при уничтожении он за собой чистит память. Но когда я присваиваю ему объект возникает проблема чистки памяти.

В принципе уже решил проблему. Сейчас приведу код в порядок, начну решать другую задачу. Всем спасибо кто помогал.
0
фрилансер
 Аватар для Алексей1153
6460 / 5662 / 1130
Регистрация: 11.10.2019
Сообщений: 15,078
17.01.2022, 19:53
pgb,
Цитата Сообщение от Алексей1153 Посмотреть сообщение
всё равно пришлось бы городить его функциональность вручную
причём, std::variant использует placement new, который выполняется "мгновенно" в сравнении с new/delete

второй момент - выделение памяти под экземпляры типов не требуется, можно хранить указатели на типы
0
 Аватар для pgb
-508 / 32 / 0
Регистрация: 22.09.2015
Сообщений: 1,232
17.01.2022, 20:46  [ТС]
Цитата Сообщение от Алексей1153 Посмотреть сообщение
хранить указатели на типы
Как сохранить указатель на тип?
0
фрилансер
 Аватар для Алексей1153
6460 / 5662 / 1130
Регистрация: 11.10.2019
Сообщений: 15,078
17.01.2022, 20:50
pgb,
C++
1
using TypesList=std::variant<std::monostate,MyType1*,MyType2*,MyType3*,MyType4*>;
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
17.01.2022, 20:51
Цитата Сообщение от pgb Посмотреть сообщение
Мне нужен не шаблонный класс который может присвоить и потом возвратить любой объект.
type erasure в помощь
1
фрилансер
 Аватар для Алексей1153
6460 / 5662 / 1130
Регистрация: 11.10.2019
Сообщений: 15,078
17.01.2022, 21:19
pgb, вот, накидал пример, если интересно https://onlinegdb.com/DmnRC-N00

C++
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
#include <iostream>
#include <variant>
 
struct MyType1{ void print()const{std::cout<<"MyType1"<<'\n';} };
struct MyType2{ void print()const{std::cout<<"MyType2"<<'\n';} };
struct MyType3{ void print()const{std::cout<<"MyType3"<<'\n';} };
struct MyType4{ void print()const{std::cout<<"MyType4"<<'\n';} };
 
using TypesList=std::variant<std::monostate,MyType1*,MyType2*,MyType3*,MyType4*>;
 
TypesList GetSomeType()
{
    //запоминаемый тип
    MyType3* p{};
    
    return TypesList{p};
}
 
int main()
{
    //получаем "сохранённый тип"
    auto list=GetSomeType();
    
    //создаём экземпляр сохранённого типа
    std::visit([](const auto& pointer)
    {
        using T=std::decay_t<decltype(pointer)>;
        if constexpr (!std::is_same_v<T,std::monostate>)
        {
            using MyTypeX=std::remove_pointer_t<T>;
            
            //создаём экземпляр
            MyTypeX variable{};
            
            //вызываем метод экземпляра
            variable.print();
        }
    },list);
}
1
 Аватар для pgb
-508 / 32 / 0
Регистрация: 22.09.2015
Сообщений: 1,232
17.01.2022, 21:58  [ТС]
Алексей1153, Спасибо, может пригодится.
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,531
Записей в блоге: 1
18.01.2022, 10:28
pgb, зачем тебе именно С++?
0
Эксперт .NET
 Аватар для Usaga
14293 / 9378 / 1352
Регистрация: 21.01.2016
Сообщений: 35,360
18.01.2022, 10:43
Kuzia domovenok, пускай лучше в вашей ветке тусит. У нас (в .NET) есть Его Правительские Звания. Нам хватает.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.01.2022, 10:43
Помогаю со студенческими работами здесь

Создать объект, который мог бы принимать в себя любой тип данных
Object ten = 10; Object str = &quot;string&quot;; Такая запись обязательна. То есть тип данных должен быть определен в шаблоне конструктора (я...

Как создать 2 фильтра данных, по булеву типу и выпадающему списку?
Перебираю данные сотрудников в цикле и вывожу в таблице.У них есть два свойства.Один по булеву типу (сотрудник либо в архиве, либо...

Как запомнить объект?
На форме присутствуют несколько объектов TImage с разными тегами, можно ли как-нибудь при первом нажатии запомнить объект, на который было...

Как сравнить некоторый объект вектора тип данных которого является структурой ?
Сама структура struct coordinate { int h; int w; }; Вектор этой структуры vector &lt;coordinate&gt; poi; Некоторое...

Тип данных аналогичный типу long из Microsoft Access
Здравствуйте. Собственно, вопрос в заголовке.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru