如何模板化容器?

doc*_*pus 5 c++ templates

我有一个函数,我想将其用于字符串容器,例如vector<string>or set<string>。显然,模板似乎是最好的解决方案,但我不确定如何对容器进行模板化。我尝试了这个,但它不起作用:

template<class T>
string pack_addrs(T<string>& caddrs) {
  string res = "";
  for (string addr : caddrs) {
    res += addr + ",";
  }
  return res.substr(0, res.size()-1);
}
Run Code Online (Sandbox Code Playgroud)

jxh*_*jxh 4

您可以允许您的模板通用地使用任何类,但断言它的行为必须像容器一样。特别是,您可以断言它有一个value_type匹配的std::string

template<class C>
std::string pack_addrs(C& caddrs) {
  static_assert(std::is_same<typename C::value_type, std::string>::value);
  std::string res = "";
  for (std::string addr : caddrs) {
    res += addr + ",";
  }
  return res.substr(0, res.size()-1);
}
Run Code Online (Sandbox Code Playgroud)

或者,如果参数的类型与所需的特征不匹配,您可以使用 SFINAE 禁用该函数。

template<class C,
         typename std::enable_if<
             std::is_same<typename C::value_type,
                          std::string>::value>::type* = nullptr>
std::string pack_addrs(C& caddrs) {
  std::string res = "";
  for (std::string addr : caddrs) {
    res += addr + ",";
  }
  return res.substr(0, res.size()-1);
}
Run Code Online (Sandbox Code Playgroud)