gpt4 book ai didi

c++ - boost::bind() 绑定(bind)额外的参数?

转载 作者:行者123 更新时间:2023-11-30 04:06:59 38 4
gpt4 key购买 nike

boost::bind() bind 是否绑定(bind)了额外的参数,因为它似乎将一个没有参数的绑定(bind)函数传递给一个期望参数 double 的函数可以正常工作?如果我要显式写出绑定(bind)函数,那应该是什么?

struct MyClass
{
void f()
{
std::cout << "f()" << std::endl;
}
};

void bar( const boost::function<void(const double&)>& f )
{
f( 1.0 );
}

int main()
{
MyClass c;

// why this compiles
bar( boost::bind( &MyClass::f, &c ) );

// what should I write if I want to create the binded function explicitly before pass into bar?
// boost::function<void(const double&)> f = boost::bind( ... boost::bind( &MyClass::f, &c ), ?? )
bar( f );

}

最佳答案

这是设计使然,调用绑定(bind)表达式时传递的未绑定(bind)参数(例如 1.0)将被忽略。

boost::function<void(const double&)> f = boost::bind(&MyClass::f, &c);
bar(f);

对于绑定(bind)表达式的显式赋值会很好。

更新评论:

请记住两条准则:

  • function<...>有一个固定的签名
  • bind表达式有固定的签名。整目的bind更改签名。这包括例如

    • 添加状态以填充从签名中删除的形式参数或
    • 添加参数,通过不将它们绑定(bind)到目标调用来忽略
    • 使用隐式转换更改参数/返回类型
    • 甚至更改参数绑定(bind)到目标可调用对象的顺序,而签名在技术上可以保持不变。

所以虽然你不能分配不同的 func<...>互相打字,你总是可以bind一个签名给另一个。

这里有一个更完整的演示,展示了您可以使用 function 执行的操作的限制。和 bind ,以及为什么(它的行为方式): Live On Coliru :

#include <boost/function.hpp>
#include <boost/bind.hpp>
#include <iostream>
#include <cassert>

int foo0() { return 0; }
int foo1(int) { return 1; }
int foo2(int,int) { return 2; }
int foo3(int,int,int) { return 3; }

int main()
{
boost::function<int()> func0;
boost::function<int(int)> func1;
boost::function<int(int,int)> func2;
boost::function<int(int,int,int)> func3;

// "straight" assignment ok:
// -------------------------
func0 = foo0; assert (0 == func0());
func1 = foo1; assert (1 == func1(-1));
func2 = foo2; assert (2 == func2(-1,-1));
func3 = foo3; assert (3 == func3(-1,-1,-1));

// "mixed" assignment not ok:
// --------------------------
// func0 = foo1; // compile error
// func3 = foo2; // compile error
// func1 = func2; // compile error, just the same
// func2 = func1; // compile error, just the same

// SOLUTION: you can always rebind:
// --------------------------------
func0 = boost::bind(foo3, 1, 2, 3); assert (func0() == 3);
func3 = boost::bind(foo1, _3); assert (func3(-1,-1,-1) == 1);
func3 = boost::bind(foo2, _3, _2); assert (func3(-1,-1,-1) == 2);
// same arity, reversed arguments:
func3 = boost::bind(foo3, _3, _2, _1); assert (func3(-1,-1,-1) == 3);

// can't bind more than number of formal parameters in signature:
// --------------------------------------------------------------
// func3 = boost::bind(foo1, _4); // in fact, the bind is fine, but assigning to `func3` fails
}

所有断言通过。当您取消注释不编译的行时,您可以尝试编译器所说的内容。

干杯

关于c++ - boost::bind() 绑定(bind)额外的参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22676281/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com