0 / 0 / 0
Регистрация: 21.03.2022
Сообщений: 26
1

Указатель на шаблонный класс

25.06.2022, 00:57. Показов 1015. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Как мне получить адрес шаблонного класса? Без сохранения размера который передается в параметры шаблона (в примере это 10).

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
using namespace std;
 
template <int size>
class MyClass{
public:
    MyClass(){}
    ~MyClass(){}
private:
    int arr[size];
};
 
int main(int argc, char** argv) {
    MyClass<10> myclass;
    MyClass<> *ptr = &myclass; //как сделать что-то типа этого
    return 0;
}
Мне это нужно для того что бы передавать класс в качестве параметра LPVOID в функцию и уже там работать с этим классом.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.06.2022, 00:57
Ответы с готовыми решениями:

Указатель на шаблонный класс
Есть ли возможность инициализировать указатель на класс с шаблоном, но не указав при этом тип, ну...

Обобщенный указатель на шаблонный класс
Здравствуйте. Имеется класс template &lt;typename T&gt; class TListManager { protected: TList &lt;T&gt;...

Указатель на абстрактный шаблонный класс
Есть абстрактный шаблон класса и 3 производных от него шаблонов классов. Так же есть шаблонная...

Собственный шаблонный указатель на функцию
#pragma once template &lt;typename ... args&gt; struct my_ptr; template &lt;typename returner, typename...

16
6091 / 3449 / 1402
Регистрация: 07.02.2019
Сообщений: 8,768
25.06.2022, 01:12 2
Цитата Сообщение от Antohych Посмотреть сообщение
Как мне получить адрес шаблонного класса?
1) у класса нет адреса, адрес есть у объекта
2) точно так же, как и у любого другого, только указать правильный тип
0
0 / 0 / 0
Регистрация: 21.03.2022
Сообщений: 26
25.06.2022, 01:58  [ТС] 3
Цитата Сообщение от zayats80888 Посмотреть сообщение
1) у класса нет адреса, адрес есть у объекта
Ну тогда у объекта класса)

Добавлено через 1 минуту
Цитата Сообщение от zayats80888 Посмотреть сообщение
2) точно так же, как и у любого другого, только указать правильный тип
Можете подсказать как правильно указать тип?)
0
6091 / 3449 / 1402
Регистрация: 07.02.2019
Сообщений: 8,768
25.06.2022, 02:14 4
Цитата Сообщение от Antohych Посмотреть сообщение
Можете подсказать как правильно указать тип?)
C++
1
MyClass<10> *ptr = &myclass;
0
0 / 0 / 0
Регистрация: 21.03.2022
Сообщений: 26
26.06.2022, 01:41  [ТС] 5
Тоесть без использования <> никак?
0
18829 / 9832 / 2403
Регистрация: 30.01.2014
Сообщений: 17,267
26.06.2022, 15:27 6
Antohych, а в чем проблема?
0
0 / 0 / 0
Регистрация: 21.03.2022
Сообщений: 26
26.06.2022, 15:29  [ТС] 7
Проблема в том что у меня могут быть классы с разным размером, не только 10
0
18829 / 9832 / 2403
Регистрация: 30.01.2014
Сообщений: 17,267
26.06.2022, 15:33 8
Antohych, <10> - это часть типа. Т.е. MyClass<10> и, например, MyClass<11> - это два разных типа.
0
0 / 0 / 0
Регистрация: 21.03.2022
Сообщений: 26
26.06.2022, 15:34  [ТС] 9
Тогда можно как-то обрабатывать эти 2 типа?

Добавлено через 17 секунд
Или как-то это обойти
0
Неэпический
17869 / 10634 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
26.06.2022, 15:35 10
Цитата Сообщение от Antohych Посмотреть сообщение
Тогда можно как-то обрабатывать эти 2 типа?
А что вы хотите-то?
0
0 / 0 / 0
Регистрация: 21.03.2022
Сообщений: 26
26.06.2022, 15:40  [ТС] 11
Ну мне нужно передать класс в функцию и уже там с ней что-то делать. Я знаю что это можно сделать по другому, например сделать с указателями и указывать резмер в конструкторе, но меня интересует именно этот способ. Есть ли такая возможность?
0
18829 / 9832 / 2403
Регистрация: 30.01.2014
Сообщений: 17,267
26.06.2022, 15:44 12
Лучший ответ Сообщение было отмечено Antohych как решение

Решение

Это к тому, что если вы поместили в void* указатель на int, то и доставать оттуда должны именно тип int*. Если вы поместили MyClass<10>*, то и доставать должны MyClass<10>*.

Возможно стоит изменить подход?
Например можно ценой небольшого снижения производительности перенести часть поведения в динамический полиморфизм.
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
#include <iostream>
 
class ArrayBase
{
public:
    virtual int* data() = 0;
    virtual size_t size() const = 0;
};
 
template <size_t Size>
class Array : public ArrayBase 
{
public:
    int* data() { return arr; }
    size_t size() const { return Size; }
 
private:
    int arr[Size];
};
 
void test(void* p);
 
int main(int argc, char** argv) {
    Array<10> arr;
    ArrayBase *ptr = &arr;
 
    test(ptr);
}
 
void test(void* p)
{
    ArrayBase*arrp = static_cast<ArrayBase*>(p);
    //......
}
Добавлено через 3 минуты
Цитата Сообщение от Antohych Посмотреть сообщение
Я знаю что это можно сделать по другому, например сделать с указателями и указывать резмер в конструкторе, но меня интересует именно этот способ.
Этот способ - основан на порождении разных типов. Если в конечном счете вам не нужны разные типы, а нужен один конкретный тип, то очевидным образом этот способ не подходит.

Либо компромиссный вариант (использование которого, впрочем, тоже должно быть обосновано) я написал выше.
1
0 / 0 / 0
Регистрация: 21.03.2022
Сообщений: 26
26.06.2022, 15:44  [ТС] 13
Спасибо большое. Чё то я и не подумал про полиморфизм)
0
18829 / 9832 / 2403
Регистрация: 30.01.2014
Сообщений: 17,267
26.06.2022, 15:49 14
Antohych, а void* вам точно нужен? Это, вообще говоря, крайняя мера от безысходности на стыке разных языков программирования.
0
0 / 0 / 0
Регистрация: 21.03.2022
Сообщений: 26
26.06.2022, 15:59  [ТС] 15
Ну здесь можно и без void*. Ну я это хотел применить в потоках. А там если использовать winapi получить даннные можно только из LPVOID

Добавлено через 44 секунды
Чесно говоря я уже реализовал это с указателями) Но теперь попробую так
0
18829 / 9832 / 2403
Регистрация: 30.01.2014
Сообщений: 17,267
26.06.2022, 16:02 16
Цитата Сообщение от Antohych Посмотреть сообщение
Ну я это хотел применить в потоках.
В С++ есть потоки, если что Они нормально работают с типизацией С++ и вам не придется использовать void*.

Цитата Сообщение от Antohych Посмотреть сообщение
Чесно говоря я уже реализовал это с указателями)
В С++ не все то, что компилируется и даже работает, является корректным и правильным
Просто на всякий случай имейте это в виду.
0
0 / 0 / 0
Регистрация: 21.03.2022
Сообщений: 26
26.06.2022, 16:13  [ТС] 17
Ну я создавал потоки с помощью CreateThread

Добавлено через 2 минуты
Ну у меня ещё вопрос небольшой есть) Я читал что если поток создан, то его нужно обязательно запустить
Вот с помощью CreateThread можно создать поток который останлвлен. Можно ли этот остановленный поток удалить?

Добавлено через 2 минуты
С помощью CloseHandle это сделать можно?

Добавлено через 1 минуту
Ну или с помощью ExitThread(вроде так называется)

Добавлено через 3 минуты
Слово удалить тут не совсем умесно. Я имел ввиде остановить, что потом удаление потока прошло успешно
0
26.06.2022, 16:13
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.06.2022, 16:13
Помогаю со студенческими работами здесь

Класс Matrix: реализовать шаблонный класс для двумерных массивов
Доброго времени суток. У меня вопрос: я создал класс Array со внутренним динамическим массивом и...

Шаблонный класс и класс одномерный массив
Задание: протестировать класс шаблон, с обычными типами данных я понял как делать, а как передать в...

Если в класс нужно передать указатель на указатель на массив строк неизвестной длинны?
Как проинициализировать массив строк wchar_t * (произвольного размера) , если его нужно передать в...

Переделать класс в шаблонный класс
Как данный процесс проделать? Я попробовал так по синтаксису из учебника: #include &lt;iostream&gt;...

Шаблонный класс
Как его реализовать??? Смысл я понимаю, но вот как записать...не знаю:cry:

Шаблонный класс
Создание шаблона класса с 1 параметром типа ( шаблонный класс ) По типу : Template&lt;Typename T&gt;...

шаблонный класс
реализован согласно &quot;Создание конструкторов и деструктора&quot; на шаблон класса с параметром -Тип...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru