gpt4 book ai didi

c++ - 是否可以使用 boost::bind 来有效地连接函数?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:22:56 25 4
gpt4 key购买 nike

假设我有一个带有任意签名的 boost::function 类型 CallbackType

  • 是否可以使用 boost::bind 组合一个函数,该函数采用与 CallbackType 相同的参数但连续调用两个仿函数?

我对任何可能的解决方案持开放态度,但这里有一个......

...使用一些魔法模板的假设示例:

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;
}

最佳答案

Boost 已经提供了一种创建绑定(bind)函数序列的方法。使用 Lambda's comma operator .

using namespace boost::lambda;
MyClass mc;
CallbackType object = (bind(&MyClass::alert, mc), bind(doIt, _1, _2, _3));
object(1, 2, 3);

这将创建一个新的仿函数,object。当您使用三个参数调用该仿函数时,它将依次调用 mc.alert(),然后再将这些参数传递给 doIt。括号很重要。

要使我上面的示例正常工作,您需要 alert 成为一个 const 函数。如果它需要是非常量,则要么将一个指针传递给mc,要么用boost::ref(mc) 包装它。 .而且您需要使用 Boost.Lambda 的 bind 而不是 Boost.Bind 的;后者与 Lambda 的函数组合运算符(尤其是逗号)不兼容。

关于c++ - 是否可以使用 boost::bind 来有效地连接函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2740822/

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