Предполагам, че това е много прост въпрос за напреднали C++ програмисти, но аз не съм такъв, така че:
Използвайки C++ 11, какъв е елегантен начин за внедряване на std::map
, който използва enum
с обхват като ключ и приема математически функции, които имат различни сигнатури като стойности:
Прост пример - може да бъде произволен числов тип или произволен брой функционални аргументи, но те са типични за моя случай на употреба:
enum class FUNCS
{
DOUBLE_FUNC1, DOUBLE_FUNC2, INT_FUNC3, INT_FUNC4
};
Някои функции:
double f1( int a, int b, double d);
double f2( int a, int b, int c, int d);
int f3( int a, double d, int c, double e);
int f4( int a, double d, int c);
Функционалността, която търся, е std::map, която работи по следния начин:
Инициализирайте картата:
mMAP[FUNCS::DOUBLE_FUNC1]=f1;
mMAP[FUNCS::DOUBLE_FUNC2]=f2;
mMAP[FUNCS::INT_FUNC3]=f3;
mMAP[FUNCS::INT_FUNC4]=f4;
Използвайте картата:
mMAP[FUNCS::DOUBLE_FUNC1](a,b,d);
mMAP[FUNCS::INT_FUNC3](a,d,c,e);
Компромис, който включва известно преобразуване на типове, може да използва функции с различни аргументи, които всички връщат double
:
double f1( int a, int b, double d);
double f2( int a, int b, int c, int d);
double f3( int a, double d, int c, double e);
double f4( int a, double d, int c);
Как мога да декларирам карта, която ще ми даде тази функционалност? Разбирам, че вероятно не мога да съпоставя тези функции директно с тези клавиши - ще ми трябва някаква абстракция/индиректност, за да постигна тази цел и вярвам, че с помощта на различни функции/шаблони това може да бъде постигнато, вижте Разнообразни аргументи и Пакет с параметри, но наистина не съм наясно как да накарам това да работи.
Междувременно имплементирах неудобно решение, използвайки тип указател на функция, който приема std::tuple
, съдържащ серия от стойности от всички възможни типове като аргумент с препратки към резултатите, и след това във всяка картографирана функция използвам подходящите членове на кортежа. ГРОЗНО!
Целта ми тук е да изпратя данни от тези различни функции към библиотека с диаграми, която генерира диаграми, използвайки данни от тип boost::any
GUI управлявана машина за състояние ще извика подходящата функция чрез картата въз основа на стойността enum, представена в машината за състояние, и генерирайте диаграма въз основа на данни от тази функция.
FUNCS
отговаря ли на един единствен, уникален тип функция? - person T.C.   schedule 09.12.2014mMAP[FUNCS::DOUBLE_FUNC1] = f2;
? - person T.C.   schedule 09.12.2014boost::any
? - person DanielKO   schedule 10.12.2014boost::any
в моя код. - person Vector   schedule 10.12.2014boost::any
ще гарантира, че го кастирате обратно към правилния тип. Изглежда, че проектирате нещо толкова абстрактно, че трябва да отговаря само за предаването на данните между производителя и потребителя. Това е идеалната работа заboost::any
. - person DanielKO   schedule 12.12.2014