boost::bind()和模板函数
boost::bind() with template functions
如何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最终,我想将绑定对象作为一个null可调用类型参数传递给另一个函数,如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))();
#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::绑定(fff,boost:;绑定(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))();
这如预期的那样给出CCD_ 14。CCD_ 15仍然可以用作CCD_ 16中的内函子。
我想不通的是如何使invoke()
和operator()()
的返回类型依赖于Fun()
的返回类型(示例中为void
)。
向@Igor R.致敬,感谢他的评论让我朝着这个方向前进。
相关文章:
- boost::bind()类似的东西,但用于函数调用
- PCL:当我在setConditionFunction中使用std::bind 时,没有合适的转换函数
- std::bind 是否实现了 std::ref 和 std::cref 来消除函数调用的歧义?
- std::bind 和 std::函数术语不值为接受 0 个参数?
- 在调用 std::bind 的产品后意外调用析构函数
- 使用 object 中的方法调用带有 std::bind 和 std::function.target 的 C 样式函数
- 我们应该在使用 std::bind 应用之前检查一个不为空的函数吗?
- 为什么 std::bind 静态类型检查传递给函数的参数?
- 对函数库中的语法感到困惑 std::bind
- 如何将参数从函数传递给 std::bind
- 如何在C++中使用 std::bind 函数作为信号处理程序?
- std::bind() 参数列表中函子的执行顺序(可能与函数参数的求值顺序无关)
- 在模板函数参数中使用 std::bind
- boost::bind函数缓冲区的最大大小
- 使用 std::thread & std::bind 在成员函数中启动线程
- 为什么 std::bind 绑定到成员函数时无法编译?
- 如何在 std::bind 中指示给定签名的重载函数?
- std::bind to a std::variant 包含多个 std::函数类型
- 编译使用 libcxx 的套接字函数 bind() 的代码失败
- 带有Boost的泛型函数bind()