什么是编译时多态性,为什么它只适用于函数?
最佳答案
很久以前,“编译时多态性”意味着函数重载。它仅适用于函数,因为它们都是你可以重载的。
在当前的 C++ 中,模板改变了这一点。 Neil Butterworth 已经举了一个例子。另一个使用模板特化。例如:
#include <iostream>
#include <string>
template <class T>
struct my_template {
T foo;
my_template() : foo(T()) {}
};
template <>
struct my_template<int> {
enum { foo = 42 };
};
int main() {
my_template<int> x;
my_template<long> y;
my_template<std::string> z;
std::cout << x.foo << "\n";
std::cout << y.foo << "\n";
std::cout << "\"" << z.foo << "\"";
return 0;
}
这应该产生 42
、0
和 ""
(一个空字符串)——我们得到一个行为不同的结构每种类型。
这里我们有类而不是函数的“编译时多态性”。我想如果你想争论这一点,你可以声称这至少部分是构造函数(一个函数)在至少一种情况下的结果,但 my_template
的特殊版本没有甚至有一个构造函数。
编辑:至于为什么这是多态性。我将“编译时多态性”放在引号中是有原因的——它与普通的多态性有些不同。尽管如此,我们得到的效果类似于我们期望从重载函数中获得的效果:
int value(int x) { return 0; }
long value(long x) { return 42; }
std::cout << value(1);
std::cout << value(1L);
函数重载和特化产生了类似的效果。我同意“多态性”是否适用于任何一个问题都可以接受,但我认为它对一个和另一个同样适用。
关于c++ - 什么是编译时多态性,为什么它只适用于函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1881468/