我试图了解模板特殊化的工作方式。 我有以下功能模板:
template <typename T>
void function(const T &t1, const T &t2)
{
std::cout << "in function template: " << t1 << ", " << t2 << std::endl;
}
现在,如果要使用指向const的指针调用此函数模板,我想专门研究一下该函数模板:
// template specialization
template <>
void function(const char *&t1, const char *&t2)
{
std::cout << "in compare template specialization: " << t1 << ", " << t2 << std::endl;
}
但是编译器抱怨找不到合适的函数模板:
In file included from main.cpp:1:0:
template.h:23:5: error: template-id 'compare<>' for 'int compare(const char*&, const char*&)' does not match any template declaration
int compare(const char *&t1, const char *&t2)
^~~~~~~
template.h:10:5: note: candidate is: template<class T> int compare(const T&, const T&)
int compare(const T &t1, const T &t2)
如果我像这样专门化模板(指向const的CONST指针的引用),它将起作用:
// template specialization
template <>
int compare(const char * const &t1, const char * const &t2) // now the pointer itself is const
{
std::cout << "in compare template specialization: " << t1 << ", " << t2 << std::endl;
}
我想用const char *Ptr = "hello world"
来调用函数,所以我认为推断出的参数T为char *,而参数为const char *&。
功能模板参数列表中的const是否总是低级const?
答案 0 :(得分:4)
模板不是像宏一样的简单令牌替换机制。 const T
的意思不是“将T
之后的const
粘贴到位”。这意味着事物的类型是“ const
是T
”。对于函数模板,如果将T
设置为const char*
,则类型const T&
将是对const
的引用,无论T
是什么,即对本身为const char*
的{{1}}的引用,即const
。实际上,与const char * const &
是类型定义的名称而不是模板参数一样,例如:
T
因此
using T = int*;
const T blub = 42; // type of blub is int* const, not const int*
不是功能模板template <>
void function(const char*& t1, const char*& t2);
的有效专业化。没有function
可以替代模板T
来获得此签名。如果将function
替换为参数const char*
,即格式为T
,则其签名将为
function<const char*>
请注意,如果您想要一个单独的函数来处理
,而不是依赖显式的专业化void function<const char*>(const char * const& t1, const char * const& t2);
情况,只需添加这样的功能并依靠重载来发挥其魔力。通常,当您发现自己编写显式的函数模板专门知识时,很可能您实际上想做的可能只是使用重载。另请参阅Template Specialization VS Function Overloading或this article(旧的,但仍然像往常一样)以了解更多……