Полагаю, это очень простой вопрос для продвинутых программистов на 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);
Как я могу объявить карту, которая даст мне эту функциональность? Я понимаю, что я, вероятно, не могу напрямую сопоставить эти функции с этими ключами - мне понадобится какая-то абстракция/косвенность для достижения этой цели, и я считаю, что это можно сделать с помощью функций/шаблонов с переменным числом аргументов, см. Аргументы Variadic и Пакет параметров, но я действительно не понимаю, как заставить это работать.
Тем временем я реализовал неуклюжее решение, используя тип указателя функции, который принимает std::tuple
, содержащий ряд значений всех возможных типов, в качестве аргумента со ссылками на результаты, а затем в каждой отображаемой функции я использую соответствующие члены кортежа. УЖАСНО!
Моей целью здесь является отправка данных из этих различных функций в библиотеку диаграмм, которая генерирует диаграммы, используя данные типа boost::any
. Конечный автомат с графическим интерфейсом будет вызывать соответствующую функцию через карту на основе значения перечисления, представленного в конечном автомате, и создайте диаграмму на основе данных этой функции.
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