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