Хотите улучшить этот вопрос? Добавьте больше подробностей и уточните проблему, отредактировав это сообщение.
Закрыт 1 год назад.
Есть функция Bingo, у нее много шаблонов, меня интересует как передать все переменные через одну переменную или массив, например будет одна переменная T1 и одна переменная T2, и в них будет целый массив, каких то переменных.
ПРИМЕР:
int
a = 01,
b = 02,
c = 03,
d = 04,
e = 05,
r = 06,
p = 07;
string
z = "text",
x = "text2",
n = "text3";
template <typename T1, typename T2>
void Bingo(T1& a, T1& b, T1& c, T1& d, T1& e, T1& r, T1& p, T2& z, T2& x, T2& n)
{
a = 777;
// код
}
Bingo(a,b,c,d,e,r,p,z,x,n); // вызвать в main
Я бы хотел видеть код таким
void Bingo(T1& abc T2& txt)
{
// код
}
Bingo(abc, txt); // вызвать в main
но при этом вы понимаете да, что abc на самом деле, содержит все переменные int внутри себя.
Еще дурацкий пример (1)
template <typename T1, typename T2>
void Bingo(T1& vec1, T2& vec2) {
a = 777; // не работает печально конечно
}
vector<int> var{ a, b, c, d, e, r, p }; // не то что нужно и вообще это копия переменных
vector<string> var2{ z, x, n};
Bingo(var, var2);
Существует такая вещь как шаблон с переменным кол-вом параметров(он же variadic template). Для применения в простых случаях требуется немного знаний о рекурсии и шаблонах.
Пример функции которая выводит на экран все что в нее передается ( любое кол-во типов, и любое кол-во передаваемых аргументов:
#include <iostream>
using namespace std;
template <typename T>
void print(T value) {
cout << value << endl;
}
template<class first, class ... others>
void print(first value, others ... package)
{
cout << value << endl;
print(package...);
}
void main() {
system("chcp 1251 > null");
string str1 = "шалость";
string str2 = "удалась";
int a = 55;
print(a, str1, 55.f, str2, "rrrr", 434 , "Sdsd");
system("pause");
}
Механизм работы вкратце и предельно простыми словами:
При вызове функции в мейне, вызывается 2 ой экземпляр функции print, в котором первый параметр first и вместо второго параметра идет пак/список параметров others... list.
Выводится на экран параметр first. Затем идет рекурсивный вызов где в качестве аргумента выступает пак list. Тут самое интересное. Вызывается все тот экземпляр что и в первый раз. От cписка list "отрывается" первый параметр и идет на место first, а оставшаяся часть списка остается в others... list.
Как только в списке остается один параметр, вызывается перегрузка функции print с одним параметром (та что c одним шаблонным параметром "Т"), выводится последний параметр и происходит выход из рекурсии.
Стоит пояснить что делает оператор "...", а именно в том месте где происходит рекурсивный вызов. Конструкция "list..." означает распаковку списка параметров, т.е вместо "list..." подставляются все параметры которые в нем хранятся через запятую.
Мозг сломать можно, согласен) Но в плюсах без этого никак.
Ну а для определения типа параметра который пришел в шаблонную функцию можно использовать RTTI.
Убрал union. Передаю аргументы в виде указателя на массив. Всё работает.
// g++ -Wall templargs.cpp
# include <string>
using std::string;
# include <iostream>
using std::cout;
template <typename T1, typename T2>
void Bingo (T1 * args1 [],T2 * args2 []){
for(size_t i = 0 ;args1[i];++ i) {
(*(args1[i])) = 777 ; }
for(size_t i = 0 ;args2[i];++ i) {
(*(args2[i])) = "777" ; } }
struct Arg {
enum { Int , String } ;
void * arg ;
int type ;
} ;
void Bingo (Arg args []) {
for(size_t i = 0 ;args[i].arg;++ i) {
switch(args[i].type){
case Arg::Int :
(*(int*)(args[i].arg)) = 888 ;
break;
case Arg::String :
(*(string*)(args[i].arg)) = "888" ;
break;
default : ; } } }
int main(){
int
a = 0,
b = 0,
c = 0,
d = 0,
e = 0,
r = 0,
p = 0;
string
z = "text",
x = "text",
cs = "text";
// создаёте массив аргументов, заканчивающийся пустым указателем
int * argsi []= {&a,&b,&c,&d,&e,&r,&p,nullptr};
string * argss[] = {&z,&x,&cs,nullptr} ;
Bingo(argsi,argss);
cout << "p="<<p<<"\n"<<"cs="<<cs<<"\n";
Arg args [ ] = { { & a , Arg::Int } , { & z , Arg::String } , { nullptr , 0 } } ;
Bingo(args);
cout << "a="<<a<<"\n"<<"z="<<z<<"\n";
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
В коде не существует ничего под именнем _DXGI_DEBUG_ALL или в чего то в этом духе, существует только DXGI_DEBUG_ALL (без нижнего подчеркивания)При линковке...
Столкнулся с проблемой сборки библиотеки pcre2, с параметром PCRE2_CODE_UNIT_WIDTH 0, для UTF-8, UTF-16, UTF-32, сборка проходит без проблем, однако при сборке для...
Возможно глупый вопрос, не судите строгоВ общем, у меня есть объект на него нужно передать ссылку этого-же типа
Я новичок в верстке,так что помидорами не кидайтесь) Как сделаны такие сайты, что слева и справа находится очень длинный фон, а по середине...