代码之家  ›  专栏  ›  技术社区  ›  Ramesh-X Wen-Shan Wendy Chow

使用模板函数打印智能指针向量

  •  0
  • Ramesh-X Wen-Shan Wendy Chow  · 技术社区  · 6 年前

    我编写了一个函数来打印给定的 vector

    template <typename T>
    void print_vector(std::string text, std::vector<T> &vect){
        std::cout << ">>>>>>>>>> " << text << " <<<<<<<<<<" << std::endl;
        for(T &t: vect){
            std::cout << t << ", ";
        }
        std::cout << std::endl << "--------------------" << std::endl;
    }
    

    但当我 矢量 属于 shared_ptr 对于函数,它打印地址,但不打印指向的值。

    当元素为 共享\u ptr 。。?
    我尝试了以下方法,但它给了我一个编译错误,我不知道如何修复它。

    template <typename T, typename F>
    void print_vector(std::string text, std::vector<T> &vect){
        std::cout << ">>>>>>>>>> " << text << " <<<<<<<<<<" << std::endl;
        for(T &t: vect){
            if(std::is_same<T, std::shared_ptr<F>>::value) {
                std::cout << *t << ", ";
            } else {
                std::cout << t << ", ";
            }
        }
        std::cout << std::endl << "--------------------" << std::endl;
    }
    
    4 回复  |  直到 6 年前
        1
  •  2
  •   Caleth    6 年前

    重载智能指针向量的函数。

    template <typename T>
    void print_vector(std::string text, std::vector<T> &vect){
        std::cout << ">>>>>>>>>> " << text << " <<<<<<<<<<" << std::endl;
        for(T &t: vect){
            std::cout << t << ", ";
        }
        std::cout << std::endl << "--------------------" << std::endl;
    }
    
    template <typename T>
    void print_vector(std::string text, std::vector<std::shared_ptr<T>> &vect){
        std::cout << ">>>>>>>>>> " << text << " <<<<<<<<<<" << std::endl;
        for(auto &t: vect){
            std::cout << *t << ", ";
        }
        std::cout << std::endl << "--------------------" << std::endl;
    }
    

    如果您有更多的情况希望打印不同的内容,您可能会发现一些重载是不明确的,您可能需要在模棱两可的模板应该相互匹配时禁用它们。

        2
  •  2
  •   Mohit    6 年前

    您可以重载运算符 shared_ptr 检查以下代码:

    template<typename T>
    ostream& operator<<(ostream& out, const shared_ptr<T>& s_ptr)
    {
        if (s_ptr != nullptr)
            out << (*s_ptr);
        return out;
    }
    
    template <typename T>
    void print_vector(std::string text, std::vector<T> &vect){
        std::cout << ">>>>>>>>>> " << text << " <<<<<<<<<<" << std::endl;
        for(T &t: vect){
            std::cout << t << ", ";
        }
        std::cout << std::endl << "--------------------" << std::endl;
    }
    
        3
  •  0
  •   Alan Birtles    6 年前

    要重载shared\u ptr的流运算符,可以是针对特定类型,也可以是针对所有类型:

    template <typename T>
    std::ostream& operator << (std::ostream& os, const std::shared_ptr< T >& p)
    {
      if ( p )
      {
        os << *p;
      }
      else
      {
        os << "<null>";
      }
      return os;
    }
    
        4
  •  0
  •   Andreas DM    6 年前

    只需重载函数模板:

    template <typename T>
    void print_vector(std::string text, std::vector<T> &vect){
        std::cout << ">>>>>>>>>> " << text << " <<<<<<<<<<" << std::endl;
        for(T &t: vect){
            std::cout << t << ", ";
        }
        std::cout << std::endl << "--------------------" << std::endl;
    }
    
    template <typename T>
    void print_vector(std::string text, std::vector<std::shared_ptr<T>> &vect) {
        std::cout << ">>>>>>>>>> " << text << " <<<<<<<<<<" << std::endl;
        for(auto &t: vect){
            std::cout << *t << ", ";
        }
        std::cout << std::endl << "--------------------" << std::endl;
    }
    

    现在它将处理这两种情况。