【发布时间】:2015-08-31 21:42:01
【问题描述】:
我编写了以下代码作为关于函数模板和模板特化的练习。这是一个计算vector 中存在多少给定类型的对象的函数:
template <typename T>
int function(const std::vector<T> &vec, T val) {
int count = 0;
for(typename std::vector<T>::const_iterator it = vec.begin(); it != vec.end(); ++it)
if(*it == val)
++count;
return count;
}
template <>
int function(const std::vector<const char*> &vec, const char* val) {
int count = 0;
for(std::vector<const char*>::const_iterator it = vec.begin(); it != vec.end(); ++it) {
if (std::string(*it) == std::string(val))
++count;
}
return count;
}
我在专业化中编写代码是因为我想知道单词中的每个字符是否与给定的文字相同。令我惊讶的是,如果我注释掉特化并让编译器实例化原始模板,它甚至适用于 const char 数组:
int main() {
std::vector<const char*> cvec = {"hi", "hi", "hallo", "hej", "hej", "hi", "hej", "hej", "hej"};
std::cout << function(cvec, "hej") << std::endl;
}
怎么可能?
【问题讨论】:
-
Upside down Jeffrey 在他的回答中解释了这里发生的事情。看到这一点的一个简单方法是定义一个局部变量
std::string hej{"hej"};,然后调用function(cvec, hej.c_str())并查看结果。在这种情况下,您将在堆上拥有一个单独的“hej”副本,您将获得预期的结果。 -
我已经简化了问题和代码,并在问题中添加了 SSCCE。如果您觉得编辑改变了问题的含义,请随时回滚到以前的版本。 :)
标签: c++ arrays templates pointers const-char