【问题标题】:Print smart pointer vector using a template function使用模板函数打印智能指针向量
【发布时间】:2018-08-20 11:57:08
【问题描述】:

我写了一个函数来打印给定的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;
}

但是当我给函数一个 vectorshared_ptr 时,它会打印地址,而不是指向的值。

当元素是shared_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;
}

【问题讨论】:

    标签: c++ c++11 vector smart-pointers


    【解决方案1】:

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

    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;
    }
    

    如果您有更多的情况希望打印不同的东西,您可能会发现某些重载是模棱两可的,您可能必须在它们应该相互匹配时禁用模棱两可的模板。

    【讨论】:

    • 你为什么需要参与enable_if?如果您有vector&lt;shared_ptr&lt;T&gt;&gt;,部分订购将选择第二个。
    • @Praetorian 好点。有需要消歧的情况,值得指出
    【解决方案2】:

    您可以为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】:

      您想为 shared_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】:

        只需重载函数模板:

        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;
        }
        

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-03-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-10-09
          • 2015-04-26
          • 1970-01-01
          相关资源
          最近更新 更多