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))();