簡體   English   中英

當可能的類型為浮點數或字符串時,如何將模板展開為字符串?

[英]How to unfold a template to string when the possible type be float or string?

在 C++ 中,我想從模板構建一個僅字符串的容器。

例如:

template<typename T>
void show(const T & t) {  // the T can be map<string, string> or <string, float> or <string, int>
  std::unordered_map<std::string, std::string> r;
  for (const auto & i : t) {
     const auto & j = i.first;
     const auto & k = i.second;  //  TODO: how to
     // make k as string, possible type of k can be 
     // int float or string???
     // put them into r
  }
  return r;
}

我該如何實施?

如果您可以使用 C++17,那么constexpr if 語句就是您想要的。 那會給你

template<typename T> // the T can be map<string, string> or <string, float> or <string, int>
std::unordered_map<std::string, std::string> show(const T & t) {  
  std::unordered_map<std::string, std::string> r;
  for (const auto & i : t) {
     const auto & j = i.first;
     const auto & k = i.second;
     if constexpr(std::is_same_v<std::decay_t<decltype(k)>, std::string>)
       r.insert(std::make_pair(j, k));
     else
       r.insert(std::make_pair(j, std::to_string(k)));
  }
  return r;
}

如果你想使用 C++11,你可以使用一個模板加上一個重載來處理這樣的調度

template<typename T>
std::unordered_map<std::string, std::string> show(const std::map<std::string, T> & t) {  
  std::unordered_map<std::string, std::string> r;
  for (const auto & i : t) {
     const auto & j = i.first;
     const auto & k = i.second;
     r.insert(std::make_pair(j, std::to_string(k)));
  }
  return r;
}

std::unordered_map<std::string, std::string> show(const std::map<std::string, std::string> & t) {  
  std::unordered_map<std::string, std::string> r;
  for (const auto & i : t) {
     const auto & j = i.first;
     const auto & k = i.second;
     r.insert(std::make_pair(j, k));
  }
  return r;
}

這是有效的,因為當傳遞std::map<std::string, std::string> ,它與非函數模板完全匹配,並且優先於函數模板。

暫無
暫無

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

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