c – 什么是编译时多态,为什么它只适用于函数?
作者:互联网
什么是编译时多态,为什么它只适用于函数?
解决方法:
回过头来,“编译时多态”意味着函数重载.它仅适用于函数,因为它们都可以超载.
在当前的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,compile-time,polymorphism 来源: https://codeday.me/bug/20190930/1835877.html