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++ 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

在上面的主函数中,注释行无法编译,尽管未注释的队列可以工作。我有一种感觉,问题在于stringer函数将变量展开,boost::bind无法找出重载之类的问题。
我如何解决这个问题,使enqueue对任何输入组合都有效?

在c++11下,我们不能绑定重载函数。 但在C++14下有一个解决方案: 例如:

structurong\u ip\u标签{};
结构字符串\u ip\u标记{};
结构解析的ip标签{};
结构无效的ip标签{};
样板
无效处理程序(_处理程序,_类型)
{

std::cout
boost::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());
}