142 / 26 / 4
Регистрация: 06.05.2019
Сообщений: 1,673
Записей в блоге: 4
1

Как вернуть тип переменной и любого другого элемента программы?

06.05.2019, 22:54. Показов 2030. Ответов 42
Метки нет (Все метки)

Есть такой примитивный код.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include "stdafx.h"//должна быть в начале
#include <conio.h>
#include <iostream>
 
using std::cout;
using std::endl;
using std::cin;
 
template<typename T> void Fun(T a[]) //здесь я использую шаблон чтобы программа сама определила какой тип
 {}                                                     //массива будет передан в функцию
 
int _tmain(int argc, _TCHAR* argv[])
{
    double mas[6]={1,2,3,4,5,6},//
    Fun(reinterpret_cast <double*>(mas));// здесь вызывается функция и если массив не одномерный как в моём случае
                                                                 //требуется запись reinterpret_cast и указание типа массива с которым будем 
                                                                 //работать функция
    _getch();
    return 0;
}
Значит вопрос в следующем: как сделать так чтобы в этом месте reinterpret_cast <double*> можно было использовать механизм который определит тип массива так в разработке предполагается работа со всеми типами массивов которые существуют в природе начиная от int и заканчивая string? Нужно создать универсальный модуль определяющий тип массива. Может кто-нибудь помочь решить эту головоломку?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.05.2019, 22:54
Ответы с готовыми решениями:

Как взять значение переменной из другой формы или другого элемента?
Как взять значение переменной из другой формы или другого элемента?

Присвоение переменной значения элемента массива из другого класса
Здравствуйте. В классе Player имеется массив public static int stats = { 40, 100, 15 }; Как...

Как определить тип переменной, ссылающейся на определённый класс? Нужен именно тип, а не ссылка на обьект!
interface HowDefineMyType { void info(); } class A implements HowDefineMyType { ...

Как спозиционировать блок относительно любого другого блока
Как абсолютно спозиционировать блока А относительно блока Б, если блок Б является не родителем, а...

42
5686 / 3129 / 1302
Регистрация: 07.02.2019
Сообщений: 7,837
07.05.2019, 11:44 2
Nexi99,
C++
1
2
3
4
5
6
7
8
9
10
11
template<class T, size_t size> void foo(T(&arr)[size])
{
    // to do..
}
int main()
{
    double arr_dbl[]{ 1,2,3,4,5,6 };
    std::string arr_str[]{ "xxx", "qqq", "www" };
    foo(arr_dbl);
    foo(arr_str);
}
0
142 / 26 / 4
Регистрация: 06.05.2019
Сообщений: 1,673
Записей в блоге: 4
07.05.2019, 16:42  [ТС] 3
Цитата Сообщение от zayats80888 Посмотреть сообщение
std::string arr_str[]{ "xxx", "qqq", "www" };
* * foo(arr_dbl);
* * foo(arr_str);
Возврат типа или все го что возвращает данный метод происходит в виде строки?
0
5686 / 3129 / 1302
Регистрация: 07.02.2019
Сообщений: 7,837
07.05.2019, 16:51 4
Цитата Сообщение от Nexi99 Посмотреть сообщение
Возврат типа или все го что возвращает данный метод происходит в виде строки?
foo ничего не возвращает, модифицирует на месте. Не ужели void не видно?
0
142 / 26 / 4
Регистрация: 06.05.2019
Сообщений: 1,673
Записей в блоге: 4
07.05.2019, 17:35  [ТС] 5
Цитата Сообщение от zayats80888 Посмотреть сообщение
модифицирует на месте
Я не умею работать с классами. Я читал справку правда mql4 там не очень понятно но написано что они могут как расширители работать. В моём случае нужно определить в этом месте
C++
1
Fun(reinterpret_cast <double*>(mas));
Как сделать так чтобы в этом месте <double*> программа определила какой это тип как здесь например
C++
1
template<typename T> void Fun(T a[])
здесь тип определяется шаблоном T a[].
0
5686 / 3129 / 1302
Регистрация: 07.02.2019
Сообщений: 7,837
07.05.2019, 18:20 6
Цитата Сообщение от Nexi99 Посмотреть сообщение
Я не умею работать с классами
template<typename T> это то же самое, что и template<class T>

Добавлено через 51 секунду
Цитата Сообщение от Nexi99 Посмотреть сообщение
Как сделать так чтобы в этом месте <double*> программа определила какой это тип как здесь например
Я ж вам показал как
0
1097 / 371 / 82
Регистрация: 17.05.2015
Сообщений: 1,206
07.05.2019, 18:27 7
Цитата Сообщение от Nexi99 Посмотреть сообщение
Может кто-нибудь помочь решить эту головоломку?
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
 
template<typename T> void Fun(T&& a) 
{
    (void)a;
}                                  
 
int main()
{
    double mas[6]={1,2,3,4,5,6};
    Fun(mas);
}
0
142 / 26 / 4
Регистрация: 06.05.2019
Сообщений: 1,673
Записей в блоге: 4
07.05.2019, 21:02  [ТС] 8
Для этого шаблон не нужен
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include "stdafx.h"//должна быть в начале
#include <conio.h>
#include <iostream>
 
using std::cout;
using std::endl;
using std::cin;
 
template<typename T> void Fun(T a[],size_t m=0,size_t n=5 )
{}
 
int _tmain(int argc, _TCHAR* argv[])
{   
    int  mas1[2][2]={{1,4},{2,6}};//int //{{},{}};
    int mas2[2][2][2];
        
    
    Fun(reinterpret_cast <int(как здесь вернуть тип) *>(mas1)/2,2);//
    Fun(reinterpret_cast <typename(mas1)*>(mas1),2,2);
    _getch();
    return 0;
}
0
5686 / 3129 / 1302
Регистрация: 07.02.2019
Сообщений: 7,837
07.05.2019, 22:09 9
Цитата Сообщение от Nexi99 Посмотреть сообщение
как здесь вернуть тип
Куда вернуть, я не понимаю что именно вы хотите.
Такое?
C++
1
2
3
4
5
6
7
8
9
10
11
12
template<class T> void Fun(T a[], size_t args...)
{}
 
int main()
{
    int  mas1[2][2] = { {1,4},{2,6} };
    int mas2[2][2][2];
 
    Fun(static_cast<int*>(*mas1), 2, 2);
    Fun(static_cast<int*>(**mas2), 2, 2, 2);
 
}
0
142 / 26 / 4
Регистрация: 06.05.2019
Сообщений: 1,673
Записей в блоге: 4
08.05.2019, 00:44  [ТС] 10
C++
1
Fun(static_cast<int*>(*mas1), 2, 2);
В этой строчке мне приходится указывать что массив имеет тип int а мне нужно построить механизм чтобы этот тип определялся сам, потому что в функцию будут передаваться массивы всех типов которые существуют в природе и функция будет с ними работать, т.е. сделать самоопределение типа.
0
119 / 94 / 35
Регистрация: 18.12.2012
Сообщений: 654
08.05.2019, 01:04 11
Цитата Сообщение от Nexi99 Посмотреть сообщение
чтобы этот тип определялся сам
Что значит "сам" ? Откуда он возьмёт этот тип, с потолка ? В cast'е Вы сами определяете, к какому типу нужно привести.
0
1097 / 371 / 82
Регистрация: 17.05.2015
Сообщений: 1,206
08.05.2019, 12:20 12
Цитата Сообщение от alkl Посмотреть сообщение
Что значит "сам" ? Откуда он возьмёт этот тип, с потолка ? В cast'е Вы сами определяете, к какому типу нужно привести.
"Сам" - это значит "касты не нужны".
(см #7)
1
142 / 26 / 4
Регистрация: 06.05.2019
Сообщений: 1,673
Записей в блоге: 4
08.05.2019, 18:58  [ТС] 13
Без "кастов" выводит адреса а мне нужны значения. Я опишу ниже комментарий что хочу сделать?

Добавлено через 6 минут
Привести к тому типу какого типа массив изначально. Я хочу двумерный массив вывести таким образом как здесь в коде ниже и без кастов оно не работает.
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
#include "stdafx.h"
#include <conio.h>
#include <iostream>
 
using std::cout;
using std::endl;
using std::cin;
 
/*template<typename T>
typename T typeof(T value)
  {
   cout <<(typename(T value)<<endl;
   return(value);
  }*/ в с++ не работает эта функция
 
template<typename T> void Fun(T a[],size_t m,size_t n)
{
      
    for ( size_t i = 0; i < m; i++ )
    {
        for ( size_t j = 0; j < n; j++ ) 
            {
        cout <<(a[i * n + j ])<<" ";}
    }
cout <<endl;
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    int mas1[2][2]={{1,4},{2,6}};//int //{{},{}};
    
 
    //Fun(reinterpret_cast <double*>(mas)/*,6,1*/);//для одномерного
    Fun(/*reinterpret_cast <int*>*/( mas1),2,2);     //для двумерного// без reinterpret_cast выводит только адреса
    //typeof(mas);
    _getch();
    return 0;
}
0
5686 / 3129 / 1302
Регистрация: 07.02.2019
Сообщений: 7,837
08.05.2019, 19:12 14
Nexi99, int mas1[2][2] Какой тип по вашему имеет mas1?
0
142 / 26 / 4
Регистрация: 06.05.2019
Сообщений: 1,673
Записей в блоге: 4
08.05.2019, 21:19  [ТС] 15
Массивы передаваемые в функцию будут иметь все типы начиная от int и заканчивая color, я не пишу детских функций, которые будут работать на статических типах, это будет сложная универсальная разработка и поэтому нужен механизм определения типа данных. В с++ я не очень опытен в этом, на mql4 не нужно указывать тип в момент вызова функции т.к. имеется запись template<typename T> void Fun(T a[],size_t m,size_t n) , которая и определяет тип данных, а в с++ нужно подумать как это сделать.
0
5686 / 3129 / 1302
Регистрация: 07.02.2019
Сообщений: 7,837
08.05.2019, 21:27 16
Цитата Сообщение от Nexi99 Посмотреть сообщение
я не пишу детских функций
Вы так и не ответили на вопрос
0
142 / 26 / 4
Регистрация: 06.05.2019
Сообщений: 1,673
Записей в блоге: 4
08.05.2019, 22:38  [ТС] 17
Вообще-то ответил он имеет тип Т. А тип Т выражает изначальный тип массива т.е. int. Я вам дал развёрнутый ответ что схема будет работать с разными типами и через одну функцию.
0
5686 / 3129 / 1302
Регистрация: 07.02.2019
Сообщений: 7,837
08.05.2019, 22:47 18
Цитата Сообщение от Nexi99 Посмотреть сообщение
он имеет тип Т. А тип Т выражает изначальный тип массива т.е. int
Тогда прежде чем писать взрослые функции, следует почитать детские книжки по С++
2
142 / 26 / 4
Регистрация: 06.05.2019
Сообщений: 1,673
Записей в блоге: 4
08.05.2019, 23:44  [ТС] 19
Инструкции которые могут мне помочь в студию буду читать, только укажите корректно где, истории о том что нужно выучить весь язык программирования писать не нужно потому что это я и так знаю что я валенок и всего языка с++ не знаю, поэтому я и спрашиваю что можно сделать.
0
5686 / 3129 / 1302
Регистрация: 07.02.2019
Сообщений: 7,837
08.05.2019, 23:53 20
Цитата Сообщение от Nexi99 Посмотреть сообщение
Инструкции которые могут мне помочь в студию буду читать
array
templates
typeid
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.05.2019, 23:53
Помогаю со студенческими работами здесь

Как в функции вернуть тип
Как сделать что-то такое, только чтобы код был валидным? :) if (data.name == attribute.Name) {...

Как для любого целого аргумента вернуть целое значение, полученное изменением порядка следования цифр на обратный
Напишите функцию, которая для любого целого аргумента возвращает целое значение, полученное...

Получить тип переменной и задать её переменной типа тип
то есть int A = 213213 Type B = A.GetType() - ну надо что-то вроде этого но для Type b =...

Как изменить текст элемента, который находится внутри другого элемента?
есть элемент span который находиться внутри элемента р, как сделать так чтобы к примеру вместо ...

Как вернуть результат работы функции, вызываемой из другого потока?
В фоновом потоке вызывается функция, возвращающая Boolean: Private Function Fn1() As Boolean ...

Как вернуть обьект тип которого заранее неизвестно
решил поучить паттерны, застрял малость на одном, а точнее на его реализации, паттер называеться...


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

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

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