c++ - 什么是编译时多态性,为什么它只适用于函数?

标签 c++ polymorphism compile-time

什么是编译时多态性,为什么它只适用于函数?

最佳答案

很久以前,“编译时多态性”意味着函数重载。它仅适用于函数,因为它们都是你可以重载的。

在当前的 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;
}

这应该产生 420""(一个空字符串)——我们得到一个行为不同的结构每种类型。

这里我们有类而不是函数的“编译时多态性”。我想如果你想争论这一点,你可以声称这至少部分是构造函数(一个函数)在至少一种情况下的结果,但 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/

相关文章:

c++ - gcc/C++ : If CPU load is low, 那么代码优化没什么用,对吗?

c++ - boost绑定(bind)回调函数指针作为参数

c++ - 如何以多态方式初始化 `static` 成员

scala - 类型上限允许子类型但不允许父类型

c++ - 如何在 Visual Studio 2017 C++ 编译时检查环境变量的存在?

C++无效引用问题

c++ - 使用 final 减少虚方法的开销

scala - 重载泛型隐式转换

c++ - 容器类型和编译时类型推导

C++98/03 std::is_constructible 实现