使用模板功能打印智能指针矢量

时间:2018-03-12 12:48:04

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

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

但是当我向函数提供vector shared_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;
}

4 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:2)

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

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 :(得分:0)

你想重载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;
}

答案 3 :(得分:0)

只是重载功能模板:

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

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