boost::bind()和模板函数

boost::bind() with template functions

本文关键字:函数 bind boost      更新时间:2023-10-16

如何boost::bind()模板函数?

我希望这段代码(受boost::bindbind_as_compose.cpp示例的启发)能够编译并运行。注意,该评估与bind_as_compose.cpp示例中的评估不同;fff()kkk():之前开始运行

template<class F> 
void fff(F fun)
{
   std::cout <<  "fff(";
   fun();
   std::cout << ")";
}
void kkk()
{
   std::cout <<  "kkk()";
}
void test()
{
   fff(kkk);             // "Regular" call - OK
   // bind(fff,kkk)();   // Call via bind: Does not compile!!!
}

打印:

fff(kkk())
fff(kkk())

更新:基于这个答案,我得到了这个工作:

void (&fff_ptr)(void(void)) = fff;
boost::bind(fff_ptr, kkk)();

然而,这需要我明确指定实例化类型,哪种类型符合目的。。。

更新2最终,我想将绑定对象作为一个null可调用类型参数传递给另一个函数,如fff()。在这种情况下,什么是显式类型?

假设我有另一个模板函数ggg():

template<class F> 
void ggg(F fun)
{
   std::cout <<  "ggg(";
   fun();
   std::cout << ")";
}

如何使用bind获取此输出:fff(ggg(kkk()))
这似乎不起作用:

boost::bind(fff<void()>, boost::bind(ggg<void()>, kkk))();
#include <iostream>
#include <functional>
template<class F>
void fff(F fun)
{
std::cout << "fff(";
fun();
std::cout << ")" <<  std::endl;
}
void kkk()
{
std::cout << "kkk()";
}
int main()
{
    // "Regular" call - OK
    fff(kkk);
    // you have to specify template parameters:
    std::bind(&fff<void()>, &kkk)();
    return 0;
}

输出为:

zaufi@gentop /work/tests $ g++11 -o bind_test bind_test.cc
zaufi@gentop /work/tests $ ./bind_test
fff(kkk())
fff(kkk())

根据问题的第二部分:

boost::绑定(fff,boost:;绑定(ggg,kkk))();

这不会编译,因为外部bind的参数不是void()类型!事实上,它确实是一个非常复杂的模板,肯定不能将强制转换为void()

回答我自己。。。似乎boost::bind不是通往这里的路
我最终得到了这个:

template <typename Fun>
class FFF_t
{   
public:
   FFF_t(Fun fun): realFun(fun) {}
   void operator()() { invoke(); }
   void invoke() 
   {
      std::cout <<  "fff(";
      realFun();
      std::cout << ")";
   }
private:
   Fun realFun;
};
template<class Fun> 
FFF_t<Fun> fff(Fun fun)
{  return FFF_t<Fun>(fun); }

这允许我写

fff(fff(kkk))();

这如预期的那样给出CCD_ 14。CCD_ 15仍然可以用作CCD_ 16中的内函子。

我想不通的是如何使invoke()operator()()的返回类型依赖于Fun()的返回类型(示例中为void)。

向@Igor R.致敬,感谢他的评论让我朝着这个方向前进。