Variadic模板:重载决议

时间:2017-03-03 19:59:25

标签: c++ c++11 variadic-templates

#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调用?有什么我想念的吗

1 个答案:

答案 0 :(得分:0)

在第一次致pair_comparer时,你有:

a = 1,b = 1,args = [2,2,6,6]

然后你有一个递归调用pair_comparer,这次你有:

a = 2,b = 2,args = [6,6]

最后,您打电话给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个参数而不是更多)