gpt4 book ai didi

c++ - 为什么专门的模板函数不能同时接受类型和常量版本?

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:44:05 24 4
gpt4 key购买 nike

如果 T 是一个类型,为什么普通函数可以同时接受 T 和 const T 而专用模板函数不能?这是否意味着程序员必须键入更多代码,这违背了使用模板的目的?

struct s
{


void func(const char *buf)
{
cout << "func(const char *)" << endl;
}


void func(const wchar_t *buf)
{
cout << "func(const wchar_t *)" << endl;
}

};

输出:当T是char*/wchar_t*时,T和const T会调用两个不同的函数

func(const char *)
func(const wchar_t *)
func(const char *)
func(const wchar_t *)

相同但有模板:

struct ss
{
template<typename T>
void func (T t)
{
cout << "func (T)" << endl;

}

template<>
void func (const char *buf)
{
cout << "func (const char *)" << endl;
}

template<>
void func(const wchar_t *buf)
{
cout << "func (const wchar_t *)" << endl;
}

};

输出:当 T 为 char*/wchar_t* 时,将为 T 和 const T 调用三个不同的函数

func (const char *)
func (const wchar_t *)
func (T)
func (T)

最佳答案

引自 C++ 标准 13.3.3.2 [over.ics.rank],第 4 页:

Standard conversion sequences are ordered by their ranks: an Exact Match
is a better conversion than a Promotion, which is a better conversion
than a Conversion.

1

这意味着如果你有结构Foo:

struct Foo {
void boo(const char*) {
}
};

然后 boo 将与 const char* 一起使用,因为 Exact Match(无需转换)和 char* 将被使用,因为 Conversion:

2

但是如果类 Foo 有更好的匹配方法:

struct Foo {
void boo(const char*) { // Conversion `char*` -> `const char*` needed
}

void boo(char*) { // Exact Match, no Conversion needed
}
};

将使用该方法:

3

由于 相同 的原因,将使用类 Foo 的模板方法。boo调用参数char *时,推导出的模板类型为char *,所以它比 const char* 更匹配:

避免代码复制/粘贴

为避免代码重复,您可以使用显式强制转换:

void boo(char* x) {
return boo(static_cast<const char*>(x));
}

或 SFINAE:

template <class T>
void boo(T*) {
using WithoutCV = typename std::remove_cv<T>::type;
static_assert(std::is_same<WithoutCV, char>::value, "");
}

注意事项

请注意,如果 T 不是指针,则不能声明重载函数使用 Tconst T 参数,因为它们是相同的:

关于c++ - 为什么专门的模板函数不能同时接受类型和常量版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24123000/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com