我如何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))();
答案 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.发表评论,他的评论让我朝着这个方向前进。