我正在尝试编写一个函数来“stringify”参数以进行日志记录。例如,我想写这样的东西:
vector<string> queries;
set<uint_8> filters;
LOG(INFO) << stringify<vector, string>(queries);
LOG(INFO) << stringify<set, uint_8>(filters);
这是我写的函数模板:
template <typename containerType, typename elemType>
string _stringify(const string name, const containerType<elemType> &elems) {
ostringstream os;
os << name << ": [";
BOOST_FOREACH(elemType elem, elems) {
os << elem << ",";
}
os << "]";
return os.str();
}
以下是我收到的错误消息:error: ‘containerType’ is not a template
谢谢, 亚历
答案 0 :(得分:9)
您需要使用模板模板参数,例如
template <template <typename> class containerType, typename elemType>
string _stringify(const string name, const containerType<elemType>& elems)
请注意,如果您希望将它与标准库容器一起使用,那么它们中的大多数都有几个模板参数(序列容器,例如,有两个:一个用于值类型,一个用于分配器类型)。
使用所有容器所具有的value_type
typedef可能更容易(也更好)。例如,
template <typename ContainerT>
void f(const ContainerT& c)
{
typedef typename ContainerT::value_type ElementT;
// Use ContainerT and ElementT
}