Мне было интересно, можно ли в C ++ получить функцию, принимающую (n-1) аргументов, из функции, принимающей n аргументов, установив для n-го аргумента значение, равное некоторому значению (которое определяется во время выполнения)?
Например, я хотел бы сделать что-то вроде следующего:
float foo(float a, float b, float c){
// do some stuff
}
float bar(float x, float y, float f(float q, float r)){
return f(x,y);
}
int main(){
double (*function)(float, float);
float some_value;
// somehow determine some_value, e.g. read from stdin.
// Now I would like to set function something along the lines of:
function = foo( . , . , some_value)
return bar(123, 456, function);
}
Концептуально, foo
- это семейство функций, индексированных c
, то есть семейство функций foo_c (float a, float b)
(читать «foo_c» как «foo subscript c» здесь), и я хочу передать foo_c
соответственно указатель на него в качестве аргумента bar
.
Возможно ли это вообще в C ++?Насколько я знаю, это невозможно с указателями функций, как указано выше.Есть ли другой способ сделать что-то подобное?
Я кратко подумал о том, чтобы сделать foo
шаблоном функции, но это не сработает, так как я хочу установить его третий аргумент во время выполнения.
Очевидное решение, конечно, состоит в том, чтобы изменить bar
так, чтобы он принимал тип float f(float q, float r, float t)
в качестве третьего аргумента, но это сделает код намного менее пригодным для повторного использования (и выглядит менее элегантно).Я также хочу передать другие функции в bar
, некоторые из которых будут принимать только два аргумента, более трех, или аргументы разных типов, которые мне как-то нужно установить на фиксированное значение, прежде чем передавать их в bar
.
Я не совсем смог выяснить, смогу ли я сделать bar
шаблонной функцией в этом случае по линиям template <typename T, typename S> float bar(float x, float y, T f(float a, float b, S param), S parameters)
, а затем вызвать ее, используя что-то вроде bar <double *(float, float, float), float> (123, 456, function, parameters)
.Будет ли что-нибудь в этом духе работать вообще?