добрый день, возникла проблема с созданием массива указателей функций, у которых различное количество параметров. Пытаюсь сделать так: Код (Text): struct FUNC { char* szName; int args; union { double (*func)(double); double (*func2)(double, double); }; }; double sinFUNC(double x) { return sin(x); } double minFUNC(double a, double b) { if(a > b) return b; return a; } FUNC Function[2] = { {"cos", 1, sinFUNC}, {"sin", 2, minFUNC}, но компилятор говорит: Код (Text): cannot convert from 'double (__cdecl *)(double,double)' to 'double (__cdecl *)(double)' None of the functions with this name in scope match the target type Подскажите, как это исправить.
Kozyr__ А зачем объединение? Используй просто указатель на функцию, а приводить к нужному типу функции будешь уже при вызове. Хотя есть и HLL решения на шаблонах - смотри boost::bind и иже с ним.
указатель на функу сделать void*, при инициализации явно приводить к нему, а при использовании приводить назад к нужному типу
Kozyr__ А для чего это делается, если не секрет? А то, может есть менее опасные и более эффективные методы. Особенно, если это не чистый Це, а ЦеПеПе.
благодарю! теперь работает так: Код (Text): struct FUNC { char* szName; int args; void* func; }; // приведение типов double (*pf)(double); pf = (double (*)(double)) Function[i].func; x = (pf)(a); ... double (*pf2)(double, double); pf2 = (double (*)(double, double)) Function[i].func; x = (pf2)(a,b); Ustus пишу небольшой скриптовый язык для рисования графиков.
Kozyr__ Вместо имени эффективнее было бы использовать хэш. EvilsInterrupt А каким боком здесь полиморфизм?
EvilsInterrupt и без полиморфизма нормально получилось IceStudent Вместо имени эффективнее было бы использовать хэш чтобы поиск функции ускорить? а какой хеш считать посоветуешь (думаю, нужно что-то простое и чтобы коллизий небыло)?
Kozyr__ Да любой хеш для строк, можешь взять из сорцов миранды, например, - у неё имена функций хешируются.