引用const的模板专业化

时间:2019-04-11 15:59:48

标签: c++ templates template-specialization function-templates

我试图了解模板特殊化的工作方式。 我有以下功能模板:

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?

1 个答案:

答案 0 :(得分:4)

模板不是像宏一样的简单令牌替换机制。 const T的意思不是“将T之后的const粘贴到位”。这意味着事物的类型是“ constT”。对于函数模板,如果将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 Overloadingthis article(旧的,但仍然像往常一样)以了解更多……