2017-03-03 6 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; 
} 

私は例をコンパイルするとは思っていませんが、 2つの引数を持つpair_comparerの呼び出しはここでどのように解決されますか?私はあなたが持っているpair_comparerへの最初の呼び出しではバリデーションテンプレート:オーバーロードの解像度

+8

第1のオーバーロードが第2のオーバーロードよりも優れた一致であると結論づける過負荷解決の規則があり、したがって再帰終了する。 ORルールの全セットは約30ページ分の標準語を取りますが、一言で言えば、最初のオーバーロードは後者の厳密な特殊ケースであり、したがってより優れています。 –

答えて

0

をしないのです何かがある:

= 1は、その後、B = 1、とargs = [2、2、6、6]

とあなた 引数= [6:finalyあなたが持つpair_comparer(T a, T b)への呼び出しを持って

= 2、B = 2、とargs = [6,6]

pair_comparerへの再帰呼び出し、あなたが持っているこの時間を持っています、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

これは、2つのオーバーロードのどちらが呼び出されたかを確認するための単なる例です。 – shujj