当仅提供一些模板参数时,C++ 编译器如何推断模板参数
How does c++ compiler infer template parameters when only some provided
我有这个 class 模板:
template<class Q, class V>
bool EQ(const Q& q, V v) {
return q.Eq(v);
}
和这个 class:
struct TEq01 {
char n1;
TEq01(const void* p) : n1(*(char*)p) { }
bool Eq(char n) const { return n1 == n; }
};
假设我这样使用它 - 只指定第一个模板参数
char *sz = "some string";
bool f = EQ<TEq01>(sz, '1');
编译器怎么知道TEq01是classQ而不是classV?我正在使用 visual studio 2013.
这是一个模板函数。函数模板从传递的任何内容中获取它们的参数类型。能够在箭头中指定类型是可选的,您不需要使用,除非您试图强制使用特定类型。
当您在箭头中指定类型时,编译器会按 1、2、3 的顺序进行操作。您未明确设置的任何类型都采用函数参数的类型。
I was just wondering how the compiler knows that TEq01 is class Q instead of class V? I'm using visual studio 2013.
您提供的第一个模板参数是第一个模板参数。
保持模板参数的顺序。
因为你写道:
template<class Q, class V>
bool EQ...
调用EQ<TEq01>
意味着“Q
是TEq01
而V
没有提供,所以必须推导。”
我有这个 class 模板:
template<class Q, class V>
bool EQ(const Q& q, V v) {
return q.Eq(v);
}
和这个 class:
struct TEq01 {
char n1;
TEq01(const void* p) : n1(*(char*)p) { }
bool Eq(char n) const { return n1 == n; }
};
假设我这样使用它 - 只指定第一个模板参数
char *sz = "some string";
bool f = EQ<TEq01>(sz, '1');
编译器怎么知道TEq01是classQ而不是classV?我正在使用 visual studio 2013.
这是一个模板函数。函数模板从传递的任何内容中获取它们的参数类型。能够在箭头中指定类型是可选的,您不需要使用,除非您试图强制使用特定类型。
当您在箭头中指定类型时,编译器会按 1、2、3 的顺序进行操作。您未明确设置的任何类型都采用函数参数的类型。
I was just wondering how the compiler knows that TEq01 is class Q instead of class V? I'm using visual studio 2013.
您提供的第一个模板参数是第一个模板参数。
保持模板参数的顺序。
因为你写道:
template<class Q, class V>
bool EQ...
调用EQ<TEq01>
意味着“Q
是TEq01
而V
没有提供,所以必须推导。”