Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 带有模板函数的boost::bind()_C++_Boost_Boost Bind - Fatal编程技术网

C++ 带有模板函数的boost::bind()

C++ 带有模板函数的boost::bind(),c++,boost,boost-bind,C++,Boost,Boost Bind,我怎样才能boost::bind()一个模板函数 我希望编译并运行这段代码(受boost::bind示例的启发)。注意:评估与bind\u as\u compose.cpp示例不同fff()在kkk()之前开始运行: 更新: 基于此,我实现了以下目标: void (&fff_ptr)(void(void)) = fff; boost::bind(fff_ptr, kkk)(); 但是,这需要我显式地指定实例化类型,哪种类型不符合目的 更新2 最后,我希望将绑定对象作为空可调用类型参数传

我怎样才能
boost::bind()
一个模板函数

我希望编译并运行这段代码(受
boost::bind
示例的启发)。注意:评估与
bind\u as\u compose.cpp
示例不同
fff()
kkk()之前开始运行:

更新: 基于此,我实现了以下目标:

void (&fff_ptr)(void(void)) = fff;
boost::bind(fff_ptr, kkk)();
但是,这需要我显式地指定实例化类型,哪种类型不符合目的

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

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

根据问题的第二部分:

boost::bind(fff,boost::bind(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())
bind()

我不知道如何使
invoke()
operator()
的返回类型依赖于
Fun()
的返回类型(示例中为
void


向@Igor R.致敬,感谢他向这个方向发送的评论。

@Rapptz:
bind(&fff,&kkk)
也不起作用。您必须显式地传递模板参数,如boost::bind(foo,args)。你可以查看相关链接,可能有很多重复。你可以制作
fff
一个成员函数模板,并利用自动类型推断功能。没有办法根据参数自动推断,即
kkk()
?@AdiShavit no.首先,您要获取函数的地址!此时没有调用,也没有参数,因此您必须明确指定要获取的
fff
的哪个实例的地址。Re:第二部分:确切地说。这就是为什么我一直在寻找一个自动类型推断的解决方案。@AdiShavit使用C++11和
decltype
:)会相对容易,但您可以尝试使用boost typeof库进行实验
void (&fff_ptr)(void(void)) = fff;
boost::bind(fff_ptr, kkk)();
template<class F> 
void ggg(F fun)
{
   std::cout <<  "ggg(";
   fun();
   std::cout << ")";
}
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())
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))();