代码之家  ›  专栏  ›  技术社区  ›  smerlin

关于c++模板函数接受任何类型的问题,只要该类型满足至少一个要求

  •  4
  • smerlin  · 技术社区  · 14 年前

    template <class T> void Print(const T& t){t.print1();}
    template <class T> void Print(const T& t){t.print2();}
    

    这不会编译:
    error C2995: 'void Print(const T &)' : function template has already been defined

    模板函数 哪种类型都行 T 只要那种类型有 print1 memberfunction或 print2 无多态性 ) ?

    2 回复  |  直到 14 年前
        1
  •  5
  •   Community Ian Goodfellow    7 年前
        2
  •  1
  •   Matthieu M.    14 年前

    template <class T>
    class HasPrint1
    {
    public:
      struct type
      {
        enum { value = ( sizeof(dummy((T*)0)) == sizeof(yes_t) ) };
      };
    
      typedef char yes_t;
      struct no_t { yes_t[2] m; };
    
      template <class C>
      static yes_t dummy(C*, size_t = sizeof(&C::print1));
    
      static no_t dummy(...);
    };
    
    // same for HasPrint2
    
    
    template <class T>
    boost::enable_if< HasPrint1<T> > Print(const T& t) { t.print1(); }
    
    template <class T>
    boost::enable_if< HasPrint2<T> > Print(const T& t) { t.print2(); }
    
    template <class T>
    boost::disable_if< boost::mpl::or_< HasPrint1<T>, HasPrint2<T> > >
    Print(const T& t) { std::cout << t << std::endl; }
    

    disable_if 选项以显示与 if / else if / else

    我很高兴得到一些评论。