boost :: bind()与模板函数

时间:2013-08-03 17:53:38

标签: c++ boost boost-bind

我如何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())

更新 基于this answer,我得到了这个工作:

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

但是,这要求我明确指定实例化类型,这种类型胜过目的......

更新2 最后,我想将绑定对象作为一个nullary callable-type参数传递给另一个函数,如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))();

2 个答案:

答案 0 :(得分: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()

答案 1 :(得分: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()operator()()的返回类型取决于Fun()void的返回类型例)。

给@Igor R.发表评论,他的评论让我朝着这个方向前进。