Cсылки на объекты в функции с не заданным типом переменных
переменных и возможно ли это?
Для общего случая я это представляю себе примерно так:
void LibHandler(DWORD dwCode, ...)
{
va_list uk_arg;
va_start(uk_arg, dwCode);
...
switch(dwCode)
{
case LH_INIT:
....
int& nRes = va_arg(uk_arg, int);
....
nRes = 55;
/*Как эти 55 заставить присвоиться исходному объекту?*/
...
break;
}
va_end(uk_arg);
}
// Где то в коде
int nRes = -1;
LibHandler(LH_INIT, nRes);
Как правильно передавать ссылки на объекты в функции с не заданным типом
переменных и возможно ли это?
Для общего случая я это представляю себе примерно так:
void LibHandler(DWORD dwCode, ...)
{
va_list uk_arg;
va_start(uk_arg, dwCode);
...
switch(dwCode)
{
case LH_INIT:
....
int& nRes = va_arg(uk_arg, int);
....
nRes = 55;
/*Как эти 55 заставить присвоиться исходному объекту?*/
...
break;
}
va_end(uk_arg);
}
// Где то в коде
int nRes = -1;
LibHandler(LH_INIT, nRes);
1. Если тебе надо передавать произвольное число аргументов ф-ции LibHandler, то есть где-то в коде писать:
LibHandler(LH_INIT, nRes);
LibHandler(LH_XXX, p1, p2, p3);
LibHandler(LH_YYY, p1, p2);
то делай как делал но чтобы вернуть значения в переданных аргументах, передавай их как указатели:
LibHandler(LH_INIT, &nRes);
тогда:
.....
case LH_INIT:
....
int *pnRes = va_arg(uk_arg, int*);
*pnRes = 55;
....
break;
....
2. Если у тебя будет тока один аргумент, то есть
LibHandler(LH_INIT, a);
LibHandler(LH_XXX, b);
LibHandler(LH_YYY, c);
то можно написать так:
void LibHandler(DWORD dwCode, void *p)
{
switch(dwCode)
{
case LH_INIT:
*((int *)p) = 55;
break;
....
default:
break;
}
....
}
передавать надо по прежнему указатели:
LibHandler(LH_INIT, &nRes);
удачи
передавать указатель на объект, а хотелось бы этого избежать, примерно как
это делается со ссылками в функцию:
MyFun(int& nTest);
....
int nNumber;
MyFun(nNumber); // Нет явного указания, что передается адрес а не сам объект.
Вот как сделать это для переменного состава параметров функции?
Да, кстати, я не раз встречал в литературе, что не рекомендуется использовать
твой второй метод для собственных классов,
потому что не все наши "изящные" решения переживают преобразование указателей
class->void->class, а вот почему - я так и не нашел объяснений.
Весь косяк в том, что при таком подходе пользователю функции приходиться явно
передавать указатель на объект, а хотелось бы этого избежать, примерно как
это делается со ссылками в функцию:
MyFun(int& nTest);
....
int nNumber;
MyFun(nNumber); // Нет явного указания, что передается адрес а не сам объект.
здесь передаёться тоже указатель, просто запись другая, тебе именно принципиален способ записи?
Да, кстати, я не раз встречал в литературе, что не рекомендуется использовать
твой второй метод для собственных классов,
Можно сделать отдельный, абстрактный класс который, передавать, и этот класс будет использоваться твоей, ф-цией.
потому что не все наши "изящные" решения
переживают преобразование указателей
class->void->class, а вот почему - я так и не нашел объяснений.
траблы возникают при пребразовании:
class A {
int a;
void f1();
};
class B {
int b;
void f2();
};
struct C : A, B {
int c;
void f3();
};
C obj;
тут (void*)&obj равнозначно (void*)(A*)&obj;, а вот (void*)&obj НЕ РАВЕН (void*)(B*)&obj;
тему можно развить, но при правильном и аккуратном использование проблем быть не должно.
здесь передаёться тоже указатель, просто запись другая, тебе именно принципиален способ записи?
Да, чтобы в пользовательском коде не сияли символы '&'.
Да, чтобы в пользовательском коде не сияли символы '&'.
имхо этого сделать для ф-ции с произвольным числом параметров нельзя.