我有一个函数,我想将其用于字符串容器,例如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)
您可以允许您的模板通用地使用任何类,但断言它的行为必须像容器一样。特别是,您可以断言它有一个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)