C++ boost绑定变量重载解析 #包括 #包括 #包括 #包括 #包括 结构类{ 样板 无效排队(T常量和T,参数常量和…参数){ 这->连接(t,args…); } 样板 无效连接(T,Args…Args){ boost::函数f =boost::bind(&CLASS::push),这个, boost::bind(&CLASS::stringer), 这个,boost::ref(t),boost::ref(args)…); } 样板 标准::字符串串(T常量和T,参数常量和…参数){ 返回纵梁(t)+纵梁(args…); } 样板 标准:弦桁条(T常量和T){ 返回升压::词法转换(t); } 无效推送(标准::字符串常量(&s){ std::fprintf(stderr,“%s\n”,s.c_str()); } }; int main(){ 丙级;; c、 排队(42,“你好”,35); //下面的注释队列无法编译 //c、 排队(“abc”,100,“代表”,42000,“萨达达”,4.3,“zzzzz\n”,42,42); 返回0; }
在上面的主函数中,注释行无法编译,尽管未注释的队列可以工作。我有一种感觉,问题在于stringer函数将变量展开,boost::bind无法找出重载之类的问题。C++ boost绑定变量重载解析 #包括 #包括 #包括 #包括 #包括 结构类{ 样板 无效排队(T常量和T,参数常量和…参数){ 这->连接(t,args…); } 样板 无效连接(T,Args…Args){ boost::函数f =boost::bind(&CLASS::push),这个, boost::bind(&CLASS::stringer), 这个,boost::ref(t),boost::ref(args)…); } 样板 标准::字符串串(T常量和T,参数常量和…参数){ 返回纵梁(t)+纵梁(args…); } 样板 标准:弦桁条(T常量和T){ 返回升压::词法转换(t); } 无效推送(标准::字符串常量(&s){ std::fprintf(stderr,“%s\n”,s.c_str()); } }; int main(){ 丙级;; c、 排队(42,“你好”,35); //下面的注释队列无法编译 //c、 排队(“abc”,100,“代表”,42000,“萨达达”,4.3,“zzzzz\n”,42,42); 返回0; },c++,templates,bind,variadic-templates,C++,Templates,Bind,Variadic Templates,在上面的主函数中,注释行无法编译,尽管未注释的队列可以工作。我有一种感觉,问题在于stringer函数将变量展开,boost::bind无法找出重载之类的问题。 我如何解决这个问题,使enqueue对任何输入组合都有效?在c++11下,我们不能绑定重载函数。 但在C++14下有一个解决方案: 例如: structurong\u ip\u标签{}; 结构字符串\u ip\u标记{}; 结构解析的ip标签{}; 结构无效的ip标签{}; 样板 无效处理程序(_处理程序,_类型) { std::cou
我如何解决这个问题,使enqueue对任何输入组合都有效?在c++11下,我们不能绑定重载函数。 但在C++14下有一个解决方案: 例如:
structurong\u ip\u标签{};
结构字符串\u ip\u标记{};
结构解析的ip标签{};
结构无效的ip标签{};
样板
无效处理程序(_处理程序,_类型)
{
std::coutboost::bind
仅限于9个参数,您提供了11个参数。请使用std::bind
代替。谢谢!您能给我一个答案让我接受吗
#include <cstdio>
#include <string>
#include <boost/bind.hpp>
#include <boost/function.hpp>
#include <boost/lexical_cast.hpp>
struct CLASS{
template<typename T, typename ... Args>
void enqueue(T const & t, Args const & ... args){
this->concatenate(t,args ...);
}
template<typename T, typename ... Args>
void concatenate(T t, Args ... args){
boost::function<void()> f
= boost::bind(&CLASS::push_,this,
boost::bind(&CLASS::stringer<T const &,
Args const & ...>,
this,boost::ref(t),boost::ref(args)...));
}
template<typename T, typename ... Args>
std::string stringer(T const & t, Args const & ... args){
return stringer(t) + stringer(args...);
}
template <typename T>
std::string stringer(T const & t){
return boost::lexical_cast<std::string>(t);
}
void push_(std::string const & s){
std::fprintf(stderr,"%s\n",s.c_str());
}
};
int main(){
CLASS c;
c.enqueue(42,"hello",35);
// below commented enqueue fails to compile
//c.enqueue("abc", 100," for ", 42000,"sadada ", 4.3, "zzzzz\n",42,42);
return 0;
}
struct ulong_ip_tag{};
struct string_ip_tag{};
struct resolved_ip_tag{};
struct invalid_ip_tag{};
template<typename _Type, typename _Handler>
void handler(_Handler, _Type)
{
std::cout << "other type" << std::endl;
}
template<typename _Handler>
void handler(_Handler, resolved_ip_tag)
{
std::cout << typeid(resolved_ip_tag).name() << std::endl;
}
template<typename _Handler>
void handler(_Handler, string_ip_tag)
{
std::cout << typeid(string_ip_tag).name() << std::endl;
}
template<typename _Handler>
void handler(_Handler, ulong_ip_tag)
{
std::cout << typeid(ulong_ip_tag).name() << std::endl;
}
void test(){}
int main()
{
//auto--- under c++14
auto b = [](auto arg1,auto arg2){handler(arg1,arg2)};
std::bind(b,test,ulong_ip_tag());
}