是否有可能通过将一个参数设置为固定值来从一个n参数函数中得到一个(n-1)参数函数?
Is it possible to get a (n-1)-argument function out of a n-argument function by setting one argument to a fixed value?
我想知道是否在c++中有可能通过将第n个参数的值设置为某些值(在运行时确定),从一个函数中获取(n-1)个参数?
。我想做如下的事情:
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下标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)
之类的东西调用它。这样的方法会奏效吗?
不能使用函数指针,但是可以使用函数对象。我建议你看看Boost。如果您使用的是c++ 03,请绑定。如果您使用的是c++ 11,则std::bind
是标准的一部分,其工作方式相同。c++ 11还引入了内置的lambdas,它可以做你想做的事情。
对于存储bind或lambda的结果,可以使用Boost。C++03中的函数或C++11中的std::function
.
这个例子是你如何在c++ 03中做到这一点。
float foo(float a, float b, float c){
// do some stuff
}
float bar(float x, float y, boost::function<float(float,float)> f){
return f(x,y);
}
int main(){
boost::function<float(float,float)> func;
float some_value;
// somehow determine some_value, e.g. read from stdin.
// Now I would like to set function something along the lines of:
func= boost::bind(foo, _1, _2, some_value);
return bar(123, 456, func);
}
在c++ 11中,您可以使用标准版本的bind和function,或者您可以使用lambda特性:
float foo(float a, float b, float c){
// do some stuff
}
float bar(float x, float y, std::function<float(float,float)> f){
return f(x,y);
}
int main(){
std::function<float(float,float)> func;
float some_value;
// somehow determine some_value, e.g. read from stdin.
// Now I would like to set function something along the lines of:
func= [some_value](float x, float y) { return foo(x,y,some_value); };
return bar(123, 456, func);
}
你不能用函数指针这样做,但是你可以用类函数对象这样做。c++ 11给出了std::bind
和std::function
(还有lambdas,但我对它们的了解不够,无法给出一个例子);在c++ 03中,boost::bind
和boost::function
非常相似。
float foo(float a, float b, float c){
// do some stuff
}
float bar(float x, float y, function<float(float, float)> f){
return f(x,y);
}
int main(){
float some_value;
// somehow determine some_value, e.g. read from stdin.
return bar(123, 456, bind(foo,_1,_2,some_value));
}
- 构造函数在退出函数时无法初始化一个参数
- 运算符重载:"operator+"必须采用零个或一个参数
- 如果需要转换,我可以在读取参数的同时将其移动到另一个参数吗?
- 两个函数模板候选项.将一个参数作为引用后,选择不太专业的模板
- 如何设置默认参数以防用户不输入另一个参数
- 使用一个参数的模板函数时出错(适用于 2)
- 仅当一个参数中未使用 std::function 时,模板函数替换才有效
- 如何在两个树通用的函数中创建一个参数?
- 使用带有一个参数函数的递归找到数字的平方
- 专门处理一个参数(C++模板)的两个模板参数
- 模板函数,其中一个参数需要专门化,而另一个不需要
- 如何更改参数包中的最后一个参数
- C++ 如何使用一个参数从派生类构造函数中调用具有两个参数的超类构造函数
- 模板参数重载,最后一个参数为非类型名
- 根据一个参数对数组进行排序
- 是否可以将指针传递给运算符,作为一个参数,例如指向函数的指针
- 用一个参数计数圆形链接列表中的节点
- 将数组作为一个参数从一个函数传递到C 中的另一个函数
- 将另一个参数传递给函子的库
- 分叉:使用一个参数运行 shell 时资源暂时不可用