int my_add(int a, std::string b) { return a + atoi(b.c_str()); }
int main() { int i = my_add(1, 2); // 两个整数相加 int s = my_add(1, "2"); // 一个整数和一个字符串相加 std::cout << "i = " << i << "\n"; std::cout << "s = " << s << "\n"; }
我注意到2003年斯坦福大学公开的一份C++ and Object-Oriented Programming教案中明确提到了函数多态概念:Function
overloading is also referred to as function polymorphism as it involves one function
having many forms。文后的“参考文献”单元给出了这个网页链接。
可能你是第一次看到宏多态(macro polymorphism)这个术语。不必讶异 —
也许我就是造出这个术语的“第一人”。显然,带变量的宏(或类似于函数的宏或伪函数宏)的替换机制除了免除小型函数的调用开销之外,也表现出了类似的多态
性。在我们上面的例子中,字符串相加所表现出来的符合直觉的连接操作,事实上是由底部运算符重载机制(operator
overloading)支持的。值得指出的是,C++社群中有人将运算符重载所表现出来的多态称为ad hoc polymorphism。
David Vandevoorde和Nicolai M. Josuttis在他们的著作C++ Templates: The Complete Guide一书中系统地阐述了静态多态和动态多态技术。因为认为“和其他语言机制关系不大”,这本书没有提及“宏多态”(以及“函数多态”)。(需要说明的是,笔者本人是这本书的繁体中文版译者之一,本文正是基于这本书的第14章The
Polymorphic Power of Templates编写而成)