引用 const 的模板特化
template specialization taking a reference to const
我正在尝试了解模板专业化的工作原理。
我有以下功能模板:
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吗?
模板不是像宏那样简单的标记替换机制。 const T
这里不是指 "paste me whatever T
is into the spot right after the const
"。这意味着那里的东西的类型是“const
无论 T
是什么”。对于函数模板,如果将 T
设置为 const char*
,则类型 const T&
将是对 const
的引用,无论 T
是什么,即,对本身是 const
的 const char*
的引用,即 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);
请注意,如果您想要一个单独的函数来处理
,而不是依赖显式特化
void function(const char*& t1, const char*& t2);
情况下,只需添加这样一个函数并依靠重载来发挥其魔力。通常,当您发现自己正在编写显式函数模板特化时,很可能您真正想要做的可能只是使用重载。另请参阅 Template Specialization VS Function Overloading or this article(旧的,但仍然一如既往地真实)以了解更多信息……
我正在尝试了解模板专业化的工作原理。 我有以下功能模板:
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吗?
模板不是像宏那样简单的标记替换机制。 const T
这里不是指 "paste me whatever T
is into the spot right after the const
"。这意味着那里的东西的类型是“const
无论 T
是什么”。对于函数模板,如果将 T
设置为 const char*
,则类型 const T&
将是对 const
的引用,无论 T
是什么,即,对本身是 const
的 const char*
的引用,即 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);
请注意,如果您想要一个单独的函数来处理
,而不是依赖显式特化void function(const char*& t1, const char*& t2);
情况下,只需添加这样一个函数并依靠重载来发挥其魔力。通常,当您发现自己正在编写显式函数模板特化时,很可能您真正想要做的可能只是使用重载。另请参阅 Template Specialization VS Function Overloading or this article(旧的,但仍然一如既往地真实)以了解更多信息……