Есть порядка 20 различных параметров X возможно разного типа. Какие то из них IN, какие то OUT, какие то IN/OUT, одни обязательные, другие нет (т.е. могут быть не указаны). Все они друг от друга зависят.
Т.е. в лоб это можно написать так,
bool CalculateA(IN int p0,
IN char* p1,
IN char* p2,
IN double p3,
INOUT double* p4,
INOUT int* p5,
OUT char* p6,
OUT double* p7,
OUT int* p8
)
{
// какие то расчеты по какому то известному алгоритму.
}
bool CalculateB(IN int p0,
IN char* p1,
IN double p2,
INOUT double* p3,
INOUT int* p4,
OUT char* p5,
OUT double* p6
)
{
// какие то расчеты по какому то известному алгоритму.
}
Функций таких много и писать такие развесистые функции по 20 параметров не хочется.
Подкиньте идеи по красивше сделать. C++03/C++11.
Спасибо.
UPD: почитал тут в соседнем топике про Ranges. Очень крута, наверное это бы мне подошло. Но не дадут заюзать в проекте.
UPD2: забыл сказать, функции эти будут лежать в Win32 DLL, которая ничего не знает о структурах и интерфейсе приложения. По сути просто расчетная библиотека там будет.
Только Путин, и никого кроме Путина! О Великий и Могучий Путин — царь на веки веков, навсегда!
Смотрю только Соловьева и Михеева, для меня это самые авторитетные эксперты.
КРЫМ НАШ! СКОРО И ВСЯ УКРАИНА БУДЕТ НАШЕЙ!
Здравствуйте, Мёртвый Даун, Вы писали:
МД>Есть порядка 20 различных параметров X возможно разного типа. Какие то из них IN, какие то OUT, какие то IN/OUT, одни обязательные, другие нет (т.е. могут быть не указаны). Все они друг от друга зависят.
МД>Т.е. в лоб это можно написать так,
МД>
МД>bool CalculateA(IN int p0,
МД> IN char* p1,
МД> IN char* p2,
МД> IN double p3,
МД> INOUT double* p4,
МД> INOUT int* p5,
МД> OUT char* p6,
МД> OUT double* p7,
МД> OUT int* p8
МД> )
МД>{
МД> // какие то расчеты по какому то известному алгоритму.
МД>}
МД>bool CalculateB(IN int p0,
МД> IN char* p1,
МД> IN double p2,
МД> INOUT double* p3,
МД> INOUT int* p4,
МД> OUT char* p5,
МД> OUT double* p6
МД> )
МД>{
МД> // какие то расчеты по какому то известному алгоритму.
МД>}
МД>
МД>Функций таких много и писать такие развесистые функции по 20 параметров не хочется.
МД>Подкиньте идеи по красивше сделать. C++03/C++11. МД>Спасибо.
Здравствуйте, Amygdala, Вы писали:
A>2) A>class ACalculator A>{ A>public: A> void SetParam1(int) A> void SetParam2(double); A> void SetParam3(char);
Я так и думал, но не хочу стопицот геттеров/сеттеров
Только Путин, и никого кроме Путина! О Великий и Могучий Путин — царь на веки веков, навсегда!
Смотрю только Соловьева и Михеева, для меня это самые авторитетные эксперты.
КРЫМ НАШ! СКОРО И ВСЯ УКРАИНА БУДЕТ НАШЕЙ!
Здравствуйте, Мёртвый Даун, Вы писали:
МД>Я так и думал, но не хочу стопицот геттеров/сеттеров
Тогда, если скорость не шибко критична, можно какой-нибудь json-подобную структуру передачи параметров организовать. И пихать все через человеко-читаемые строки.
Здравствуйте, Мёртвый Даун, Вы писали:
МД>UPD2: забыл сказать, функции эти будут лежать в Win32 DLL, которая ничего не знает о структурах и интерфейсе приложения. По сути просто расчетная библиотека там будет.
Здравствуйте, Мёртвый Даун, Вы писали:
МД>Подкиньте идеи по красивше сделать. C++03/C++11.
Абстрактуню фабрику калькуляторов можно сделать, при желании что-то можно через шаблоны и специализацию задавать. Ну и эта, int p0 надо бы типизировать как-то, полагаю, половина параметров флаги или ччто-то подобное.
МД>Есть порядка 20 различных параметров X возможно разного типа. МД>эти будут лежать в Win32 DLL, которая ничего не знает о структурах и интерфейсе приложения.
Исходя из этого получается что придётся таки писать функции с кучей параметров. Можно только посоветовать сделать IN параметры const и посочувствовать.
Здравствуйте, Мёртвый Даун, Вы писали:
МД>Есть порядка 20 различных параметров X возможно разного типа. Какие то из них IN, какие то OUT, какие то IN/OUT, одни обязательные, другие нет (т.е. могут быть не указаны). Все они друг от друга зависят.
Я бы не заморачивался но добавл бы управление и логирование происходящего.
struct Control {
Trace trace;
Cancel cancel;
};
/*
TimeoutCancel timelimit(1000);
Control control[1];
control->trace=trace_to_console;
control->cancel=timelimit;
*/struct CalculateA_arguments {
IN int p0;
IN char *p1,*p2;
IN double p3;
INOUT double* p4;
INOUT int* p5;
OUT char* p6;
OUT double* p7;
OUT int* p8;
} CalculateA_arg;
/* usage example:
CalculateA_arg arg[1];
arg->p0=0;
arg->p1="p1";
arg->p2="p2";
//...
CalculateA(arg,control);
//...
*/int API CalculateA(CalculateA_arg *arg,Control *control);
// ... и так 20 раз
//-----------------------------------------------------------------
// каждый расчет в своём файле int API CalculateA(CalculateA_arg *arg,Control *control) {
int result=0;
if (control) {
control->trace("begin calculation\n");
control->trace("p0=%d\n",p0);
//...
}
for(;;) {
if (control && control->cancel()) { result=1; break; }
if (control) control->trace("inside infinite loop");
}
if (control) {
if (result==0) control->trace("success");
else control->trace("bad news for everyone");
}
return result;
}