【发布时间】:2010-04-29 21:14:25
【问题描述】:
假设我有一个 boost::function ,它带有一个名为CallbackType 的任意签名。
- 是否可以使用
boost::bind组成一个函数,该函数采用与 CallbackType 相同的参数但连续调用两个函子?
我对任何可能的解决方案持开放态度,但这里有一个...
...使用一些magic 模板的假设示例:
Template<typename CallbackType>
class MyClass
{
public:
CallbackType doBoth;
MyClass( CallbackType callback )
{
doBoth = bind( magic<CallbackType>,
protect( bind(&MyClass::alert, this) ),
protect( callback ) );
}
void alert()
{
cout << "It has been called\n";
}
};
void doIt( int a, int b, int c)
{
cout << "Doing it!" << a << b << c << "\n";
}
int main()
{
typedef boost::function<void (int, int, int)> CallbackType;
MyClass<CallbackType> object( boost::bind(doIt) );
object.doBoth();
return 0;
}
【问题讨论】:
-
magic是否应该按照bind来实现?bind的作用是什么?当然,您实际上并没有将任何内容绑定到回调。 -
magic可能是一些模板,它会自动创建一个函子,该函子将两个函子作为参数 +CallbackType的所有参数......但这只是为了说明我的目标,而不是必须提供一个现实的解决方案。我愿意接受截然不同的建议。 -
您是否尝试将
void (void)与void (int, int, int)组合在一起?或者这只是一个错字? -
不,这是正确的......只是问题的另一个复杂性。模板无法提前知道 sig 是什么,因此无法使
alert匹配它。 -
您能否通过一个具体而简单的示例(没有绑定)清楚地说明您想要实现的组合是什么?考虑到当一个函数的结果是另一个函数的输入时,函数组合是有意义的。
标签: c++ boost callback bind functor