0

我怎样才能boost::bind()使用模板功能?

我希望这段代码(受boost::bind bind_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 最终,我想将绑定对象作为空值可调用类型参数传递给另一个函数,例如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))();
4

2 回答 2

1
#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::bind(fff, boost::bind(ggg, kkk))();

这不会编译,因为外部的参数bind不是void()类型!它实际上是一个非常复杂的模板,绝对不能转换void()

于 2013-08-03T18:03:02.753 回答
0

回答自己......似乎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))();

正如fff(fff(kkk()))预期的那样。 bind()仍然可以用作内部函子,如fff(fff(bind(some2argFun,1,2))))().

我想不通的是如何使invoke()andoperator()()的返回类型取决于Fun()(void在示例中) 的返回类型。

向@Igor R. 致敬,因为他的评论让我朝这个方向发展。

于 2013-08-04T09:56:31.667 回答