簡體   English   中英

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

[英]Print smart pointer vector using a template function

我寫了一個函數來打印給定的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_ptrvector提供給函數時,它將輸出地址,而不是指向的值。

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

您可以為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;
}

重載智能指針矢量的函數。

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

如果在更多情況下希望打印不同的內容,則可能會發現某些重載是模棱兩可的,當模棱兩可的模板彼此匹配時,可能必須禁用它們。

您想重載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;
}

只是重載功能模板:

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

現在它將處理這兩種情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM