当只提供一些时,c ++编译器如何推断模板参数

时间:2015-01-14 22:51:00

标签: c++ templates c++11 type-inference

我有这个课程模板:

template<class Q, class V>
bool EQ(const Q& q, V v) { 
    return q.Eq(v); 
}

和这堂课:

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 Q类而不是 V类?我正在使用visual studio 2013。

2 个答案:

答案 0 :(得分:2)

这是一个模板化的功能。函数模板从它们传递的任何内容中获取它们的参数类型除非您试图强制使用特定类型,否则能够在箭头中指定类型是您不需要使用的可选项。

当您在箭头中指定类型时,编译器按顺序排列,1,2,3。您未显式设置的任何类型都从函数参数中获取类型。

答案 1 :(得分:2)

  

我只是想知道编译器如何知道TEq01是Q类而不是V类?我正在使用visual studio 2013。

您提供的第一个模板参数第一个模板参数

维护模板参数的顺序。

既然你写了:

template<class Q, class V>
bool EQ...

调用EQ<TEq01>表示“QTEq01且未提供V,因此必须推断出来。”