非虚拟成员函数是否可以使用模板参数?

Can non-virtual member functions use template parameters?

本文关键字:参数 可以使 虚拟成员 函数 是否      更新时间:2023-10-16

我一直想知道,非虚拟成员函数可以使用模板参数吗?IOW,使用模板参数的函数应该是虚拟的吗?

例:

template<int N>
class SomeClass
{
public:
SomeClass() {}
// Can this function be non-virtual?
int getValue() {
return N;
}
}

如果我理解正确,编译器基本上会为每个模板参数生成一个类。在上面的例子中,从SomeClass隐式生成多个类(每个 N 值一个(。因此,根据我的理解,getValue()需要根据实际(运行时(类型动态调度(到函数的不同实例(。

我知道编译器不会强制这些函数是虚拟的,但它可以做一些魔术,还是我真的必须使函数虚拟才能通过指针等调用正确的实例?

因此,根据我的理解,getValue(( 需要根据实际(运行时(类型动态调度(到函数的不同实例(。

在对象声明中编码的类型:

SomeClass<0> s;
s.getValue();

编译器将调度给SomeClass<0>::getValue。它不必在运行时调度,它都静态地可用于类型系统。实例化类模板以创建类后,它就像任何其他一样。如果你要写:

SomeOtherClass c; // Not a template
s.doSomething();

编译器知道它应该调度给SomeOtherClass::doSomething一样。