Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.93/15: Рейтинг темы: голосов - 15, средняя оценка - 4.93
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564

Шаблоны для функций, массивы и Args

03.03.2015, 14:37. Показов 3524. Ответов 26
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть вот такой вот код:
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#include "windows.h"
#include "windowsx.h"
 
using namespace std;
 
struct var
{
    union
    {
        bool b;
        int i;
        PVOID vp;
        char *pc;
        void *pv;
        operator bool & ()
        {
            cout << "### Bool overload operator" << endl;
            return b;
        }
        operator int & ()
        {
            cout << "### Int overload operator" << endl;
            return i;
        }
        operator PVOID & ()
        {
            cout << "### PVOID overload operator" << endl;
            return vp;
        }
        operator char * ()
        {
            cout << "### Char[] overload operator" << endl;
            return pc;
        }
        operator void * ()
        {
            cout << "### Void[] overload operator" << endl;
            return pv;
        }
    }d;
};
var **v;
 
template<typename Result, typename... Args>
void call(void * fun, Result& r, Args ... args)
{
    using func_type = Result(_cdecl *)(Args...); // прототип функции
    r = ((func_type)fun) (args...); // вызов функции
}
 
int SomeFunc();
int TestMassive(var *&fvar);
 
int _tmain(int argc, _TCHAR* argv[])
{
    if(SomeFunc()==0)
        cout << "End Programm" << endl;
    _getch();
    return 0;
}
int SomeFunc()
{
    int res = 0;
    int b = 2;
    v = new var*[b];//динамическая матрица
    v[0] = new var[10];
    v[1] = new var[6];
    v[0][0].d.i = 10;
    v[0][1].d.pc = new char[100];
    v[0][2].d.pc = new char[100];
    v[0][3].d.vp = NULL;
    v[0][4].d.vp = NULL;
    v[0][5].d.i = NULL;
    v[0][6].d.i = 100;
    v[0][7].d.pc = new char[100];
    v[0][8].d.i = 99;
    v[0][9].d.i = 10;
    //
    v[1][0].d.i = 6;
    v[1][1].d.i = NULL;
    v[1][2].d.i = 100;
    v[1][3].d.pc = new char[100];
    v[1][4].d.i = 99;
    v[1][5].d.i = 10;
    //
    strcpy_s(v[0][1].d.pc, v[0][8].d.i, "msvcr120.dll");
    cout << "Library Name: " << v[0][1].d.pc << endl;
    int go = 0;
    v[0][3].d.vp = GetModuleHandleA(v[0][1].d);
    if (!v[0][3].d.vp)
    {
        cout << "Library -NOT- found, try load..." << endl;
        v[0][3].d.vp = LoadLibraryA(v[0][1].d);
        if (!v[0][3].d.vp)
            cout << "Library -NOT- loaded" << endl;
        else
        {
            cout << "Library loaded" << endl;
            go = 2;
        }
    }
    else
    {
        cout << "Library found" << endl;
        go = 1;
    }
    if(go != 0)
    {
        strcpy_s(v[0][2].d.pc, v[0][8].d.i, "_itoa_s");//_itoa_s
        cout << "Function Name: " << v[0][2].d.pc << endl;
        v[0][4].d.vp = GetProcAddress((HMODULE)v[0][3].d.vp, v[0][2].d.pc);
        if (!v[0][4].d.vp)
            cout << "Function -NOT- found" << endl;
        else
        {
            cout << "Function found, try call..." << endl;
            call(v[0][4].d.vp, v[1][1].d, v[1][2].d, v[1][3].d, v[1][4].d, v[1][5].d);
            if (v[1][1].d.i != NULL)
                cout << "Failed result, error: " << v[1][1].d.i << endl;
            else
                cout << "Returned STR: " << v[1][3].d.pc << endl;
        }
        if (go == 2)
        {
            FreeLibrary((HMODULE)v[0][3].d.vp);
            cout << "Library cleaned" << endl;
        }
    }
    delete []v[0][7].d.pc;
    delete []v[0][2].d.pc;
    delete []v[0][1].d.pc;
    delete []v[0];
    delete []v[1][3].d.pc;
    delete []v[1];
    delete []v;
    return res;
}
 
int TestMassive(var *&fvar)
{
    int res = 0;
    if (!fvar)
        return -1;
    if (!fvar[0].d)
        return -2;
    if (fvar[0].d.i < 2)
        return -3;
    return res;
}
Как видно, вызов функции происходит через шаблон, строкой:
C++
1
call(v[0][4].d.vp, v[1][1].d, v[1][2].d, v[1][3].d, v[1][4].d, v[1][5].d);
Хотелось бы вызывать функцию через передачу массива, что то типа того:
C++
1
call(v[0][4].d.vp, v[1]);
Для наглядности того, как массив передаётся в обычную функцию:
C++
1
res = TestMassive(v[1]);
И так можно ли как то "конвертнуть" массив в Args... ? И как это сделать) *Или может надо как то по другому?
П.С. ещё вопросик: почему при вызове шаблона старым способом не идут строки перегузки операторов?

Добавлено через 2 минуты
"П.СС", в втором массиве v[1][0] - число аргументов, ну для проверки, к слову..

Добавлено через 19 часов 14 минут
Может вообще невозможно создать "ellipse" из массива? Я предполагаю что логически то что мне нужно, это вытащить из массива v[1] аргументы, а далее сформировать из них "typename... Args", только как не нашёл, что то в инете даже намёков нету
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.03.2015, 14:37
Ответы с готовыми решениями:

Шаблоны функций для работы с массивами
Написал код решения задачки: Условие: Написать шаблоны функции (int, double, char) для выполнения следующих задач • Нахождения...

Написать перегруженные шаблоны функций для уравнений
Написать перегруженные шаблоны функций для нахождения корней линейного (a*x+b=0) и квадратного (a*x*x+b*x+c=0) уравнений. В функции...

Как мне использовать эту программу, и что означает args[0] и args[1] в 11 и 20 строках?
Как мне использовать эту программу, и что означает args и args в 11 и 20 строках?using System; using System.IO; class CopyFile { ...

26
 Аватар для Voivoid
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
04.03.2015, 12:45
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Izual Посмотреть сообщение
И сразу же пример тебе, т.к. ты не понимаеш сути образов статики и динамики и из взаимосвязи:
Ну если вкратце, то ты напридумывал для себя каких-то образов не имеющих никакой связи с реальностью и пытаешься натянуть их на глобус
0
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
04.03.2015, 13:38  [ТС]
Цитата Сообщение от Voivoid Посмотреть сообщение
напридумывал для себя каких-то образов
Возьми англо-русский словарь, переведи. Возьми толковый словарь - посмотри значение. Т.к. толковый словарь даст сугубо догматичное представление, то для разширения кругозора пользуйся этимологией буквицы.
Цитата Сообщение от Tulosba Посмотреть сообщение
Семантика слов в данном треде должна отражать особенности раздела форума
Как кота не назови, он останется усатым животным, с т.п. рядом признаков..
Цитата Сообщение от Tulosba Посмотреть сообщение
Термины "статика" и "динамика" в данном случае соответствуют выражениям "время компиляции" и "время выполнения" соответственно.
И чо? ~ ~
0
 Аватар для Voivoid
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
04.03.2015, 13:57
Цитата Сообщение от Izual Посмотреть сообщение
Возьми англо-русский словарь, переведи. Возьми толковый словарь - посмотри значение.
А, ну, т.е. вместо того, чтобы почитать что-нибудь по C++ или же скажем по теории типов ты руководствуешься разного рода словарями. Что тут сказать....., круто

Цитата Сообщение от Izual Посмотреть сообщение
то для разширения кругозора пользуйся этимологией буквицы.
дайте две
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
04.03.2015, 13:57
Izual, И то, что шаблоны работают во время компиляции. Во время выполнения нет никаких шаблонов. Шаблоны инстанцируются на этапе компиляции и тип, которым параметризуется шаблон, обязан быть известен на этапе компиляции. Собственно, в вашем коде аналогично все типы известны на этапе компиляции.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
04.03.2015, 14:00
Цитата Сообщение от Izual Посмотреть сообщение
Как кота не назови, он останется усатым животным, с т.п. рядом признаков..
Т.е. кот без усов это уже не кот?
Цитата Сообщение от Izual Посмотреть сообщение
И чо? ~ ~
Знаешь выражение "В чужой монастырь со своим уставом не ходят"? А теперь проведи параллели с текущей темой. В любой достаточно сложной предметной области, есть свои устоявшиеся термины, смысл которых (в определенном контексте) превалирует над смыслом этого термина в общедоступном варианте. И в данном случае шаблоны в C++ к "динамике" не имеют никакого отношения. Т.к. под "динамикой" понимается "время выполнения", а во время выполнения никаких шаблонов (C++ templates) не существует.
0
19506 / 10109 / 2463
Регистрация: 30.01.2014
Сообщений: 17,833
04.03.2015, 14:11
Цитата Сообщение от Izual Посмотреть сообщение
И сразу же пример тебе, т.к. ты не понимаеш сути образов статики и динамики и из взаимосвязи:
У меня есть топор, молоток и лопата. Это статические объекты. Статически они лежат в гараже в неподвижности. Динамически - я "вызываю" лопату и начинаю проводить ряд манипуляций.
Вот ты этим примером показал, что не понимаешь, что такое тип в языке. Тип - это не молоток, как ты выразился, тип это чертеж молотка. Молоток - это объект. Лежит он или нет, дело десятое. Он реален и существует. У него даже адрес есть - гараж. А вот тип - это содержание без формы, чертеж. Когда мы по чертежу молотка сделали молоток, получили динамику. До тех пор пока он остается на бумаге - у нас статика.
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
04.03.2015, 15:15
Цитата Сообщение от Izual Посмотреть сообщение
Вася, в моём на время компиляции никакого типа не известно, т.к. типы как и сами данные появляются из динамического массива, статическая там лишь передача кол-ва аргументов в шаблон.
Учи матчасть.
C++
1
var **v;
v имеет тип указатель на указатель на var.
C++
1
call(v[0][4].d.vp, v[1][1].d, v[1][2].d, v[1][3].d, v[1][4].d, v[1][5].d);
Вызвать функцию call с аргументами типов:
PVOID, анонимный union, анонимный union, анонимный union, анонимный union, анонимный union.
Итого функция call на самом деле является

C++
1
void call(void * fun, union0001& result, union0001 arg1, union0001 arg2, union0001 arg3, union0001 arg4)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.03.2015, 15:15

Какого типа args main(string[] args)?
Привет всем :) Я лабы сдавал по С# и вроде бы все выучил, но преподаватель спросил, &quot;main(string args) какого типа args?&quot;, я...

Написать перегруженные шаблоны функций для нахождения корней линейного (a*x + b = 0) уравнения
Кто знает как решить задачу на С++, при помощи шаблонных функций? Написать перегруженные шаблоны функций для нахождения корней линейного ...

Перегрузка функций, шаблоны функций Функция определения объемов: шара по его радиусу
Перегрузка функций, шаблоны функций Функция определения объемов: шара по его радиусу (V=4/3пиR2), конуса по радиусу основания и высоте...

Незнакомый синтаксис args = [this, args[0]]
Я только начал изучать Javascript. Пытаюсь на примере NicEdit улучшить свои знания. В коде встретил запись args = ]; Я понимаю что...

Написать шаблоны функций для для вычисления суммы произведений двух соседних чисел для трех целых чисел и в одномерном массиве целых чисел
Написать шаблоны функций для для вычисления суммы произведений двух соседних чисел для трех целых чисел и в одномерном массиве целых чисел:...


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

Или воспользуйтесь поиском по форуму:
27
Ответ Создать тему
Новые блоги и статьи
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru