diff --git "a/Ch8\345\207\275\346\225\260\346\216\242\345\271\275/\345\207\275\346\225\260\346\250\241\346\235\277/choices.cpp" "b/Ch8\345\207\275\346\225\260\346\216\242\345\271\275/\345\207\275\346\225\260\346\250\241\346\235\277/choices.cpp" new file mode 100644 index 0000000000000000000000000000000000000000..ccc84135275c741fc037839101873867a94e35a7 --- /dev/null +++ "b/Ch8\345\207\275\346\225\260\346\216\242\345\271\275/\345\207\275\346\225\260\346\250\241\346\235\277/choices.cpp" @@ -0,0 +1,105 @@ +/* +* 自己选择 +* 在有些情况下,可通过编写合适的函数调用, +引导编译器做出您希望的选择。 +请看程序choices.cpp,该程序将模板函数定义放在文件开头, +从而无需提供模板原型。与常规函数一样, +通过在使用函数前提供模板函数定义,它让它也充当原型。 +* +*/ + +//choices.cpp -- choosing a template + + +#include + +template //or template +T lesser(T a, T b) //#1 +{ + return a < b ? a : b +} + +int lesser(int a, int b) //#2 +{ + a = a < 0 ? -a : a; + b = b < 0 ? -b : b; + return a < b ? a : b; +} + + +int main(void) +{ + + using namespace std; + int m = 20; + int n = -30; + double x = 15.5; + double y = 25.9; + + + cout << lesser(m, n) << endl; //use #2 + + cout << lesser(x, y) << endl; //use #1 with double + + cout << lesser<>(m, n) << endl; //use #1 with int + + cout << lesser(x, y) << endl; //use #1 with int + + + + return 0; +} + + +//最后的函数调用将double转换为int, +//有些编译器会针对这一点发出警告。 +/* +* 程序提供了一个模板和一个标准函数, +其中模板返回两个值中较小的一个, +而标准函数返回两个值中绝对值较小的那个。 +如果函数定义是在使用函数前提供的, +它将充当函数原型,因此这个示例无需提供原型。请看下面的语句: + + +cout << lesser(m, n) << endl; //use #2 +这个函数调用与模板函数和非模板函数都匹配, +因此选择非模板函数,返回20。 + + +接下来,下述语句中的函数调用与模板匹配(T为double): + cout << lesser(x, y) << endl; //use #1 with double + + + 现在来看下面的语句: + cout << lesser<>(m, n) << endl; //use #1 with int + lesser<(m, n)中的<>指出,编译器应选择模板函数, + 而不是非模板函数;编译器注意到实参的类型为int, + 因此使用int替代T对模板进行实例化。 + + + + 最后,请看下面的语句: + cout << lesser(x, y) << endl; //use #1 with int + 这条语句要求进行显式实例化(使用int替代T), + 将使用显式实例化得到的函数。 + x和y 的值将被强制转换为int, + 该函数返回一个int值, + 这就是程序显示15而不是15.5的原因所在。 +*/ + + + +//多个参数的函数 +/* +* 将有多个参数的函数调用与有多个参数的原型进行匹配时, +情况将非常复杂。编译器必须考虑所有参数的匹配情况。 +如果找到比其他可行函数都合适的函数,则选择该函数。 +一个函数要比其他函数都合适, +其所有参数的匹配程度都必须不比其他函数差, +同时至少有一个参数的匹配程度比其他函数都高。 +* +* +*/ + +//本书并不是要解释复杂示例的匹配过程, +//这些规则只是为了让任何一组函数原型和模板都存在确定的结果。 \ No newline at end of file