2017-03-03 54 views
0
#include <iostream> 

template<typename T> 
bool pair_comparer(T a, T b) { 
    return a != b; 
} 

template<typename T, typename... Args> 
bool pair_comparer(T a, T b, Args... args) { 
    return a == b && pair_comparer(args...); 
} 

int main() { 
    bool areSame = pair_comparer(1, 1, 2, 2, 6, 6); 
    std::cout << "areSame " << areSame << endl; // prints 0 
    return 0; 
} 

我不希望这个例子编译,但它是。如何调用pair_comparer这里解决了两个参数?有什么我很想念Variadic模板:超载分辨率

+8

有重载解析的规则可以得出结论,第一个重载比第二个更好匹配,因此递归终止。整套OR规则占用了大约30页的标准,但简而言之,第一个超载是后者的严格特例,因此更好。 –

回答

0

在第一次调用pair_comparer您有:

A = 1,B = 1,和args = [2,2,6,6]

,然后你必须pair_comparer递归调用,这个时候你有:

A = 2,b = 2,和args = [6,6]

finaly你有一个呼叫到pair_comparer(T a, T b)与: ARGS = [6 ,6]

但是你必须把return a == b;而不是return a != b;bool pair_comparer(T a, T b)得到正确的答案。这意味着所有的数字都是通过对

平等的,但如果你开始用只有两个参数来调用:

例如有:

bool areSame = pair_comparer(6, 6);

程序将直接调用:pair_comparer(T a,T b),因为它是第一次匹配(我们只有2个参数而不是更多)

+0

这只是一个例子,看看哪两个重载被调用。 – shujj