Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何创建容器模板?_C++_Templates - Fatal编程技术网

C++ 如何创建容器模板?

C++ 如何创建容器模板?,c++,templates,C++,Templates,我有这个函数,我想用于字符串容器,比如vector或set。显然,模板似乎是这里最好的解决方案,但我不确定如何模板化容器。我试过这个,但不起作用: template<class T> string pack_addrs(T<string>& caddrs) { string res = ""; for (string addr : caddrs) { res += addr + ","; } retu

我有这个函数,我想用于字符串容器,比如
vector
set
。显然,模板似乎是这里最好的解决方案,但我不确定如何模板化容器。我试过这个,但不起作用:

template<class T>
string pack_addrs(T<string>& caddrs) {
  string res = "";
  for (string addr : caddrs) {
    res += addr + ",";
  }
  return res.substr(0, res.size()-1);
}
模板
字符串包地址(T&caddrs){
字符串res=“”;
用于(字符串地址:caddrs){
res+=addr+“,”;
}
返回res.substr(0,res.size()-1);
}

当模板参数本身是模板类型时,您可以对其使用,例如:

模板
字符串包地址(常量容器和CADDR){
字符串res;
for(常量字符串和地址:caddrs){
res+=addr+“,”;
}
返回res.substr(0,res.size()-1);
}


此代码将允许您传入任何接受
std::string
作为其第一个模板参数的模板化容器(即使它接受其他模板参数,如分配器等),并且满足的要求。

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

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);
}
模板
标准::字符串包地址(C&caddrs){
静态断言(std::is\u same::value);
std::string res=“”;
for(std::string addr:caddrs){
res+=addr+“,”;
}
返回res.substr(0,res.size()-1);
}
或者,如果参数的类型与所需特征不匹配,可以使用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);
}
template::type*=nullptr>
标准::字符串包地址(C&caddrs){
std::string res=“”;
for(std::string addr:caddrs){
res+=addr+“,”;
}
返回res.substr(0,res.size()-1);
}

IMHO,不建议使用该功能。例如,没有一个标准方法可以插入到容器中。另外,我认为这个函数所节省的麻烦和开发时间是不值得的。您能看到一个接收容器参数的算法吗?不这是有原因的。