我一直想知道,非虚拟成员函数可以使用模板参数吗? IOW,使用模板参数的函数应该是虚拟的吗?
示例:
template<int N>
class SomeClass
{
public:
SomeClass() {}
// Can this function be non-virtual?
int getValue() {
return N;
}
}
如果我理解正确,则编译器基本上将为每个模板参数 value 生成一个类。在上面的示例中,将衍生自SomeClass
隐式生成的多个类(每个N值一个)。因此,据我所知,getValue()
将需要根据实际(运行时)类型动态地分派(到函数的不同实例)。
我知道编译器不会将这些函数强制为虚拟的,但是它可以做一些魔术吗?或者我真的必须使该函数虚拟为具有正确的实例,例如通过指针?
答案 0 :(得分:2)
因此,据我了解,根据实际(运行时)类型,需要动态地将getValue()调度到(函数的不同实例)。
一种在对象声明中编码的类型:
SomeClass<0> s;
s.getValue();
编译器将分派到SomeClass<0>::getValue
。它不必在运行时调度,它对于类型系统是静态可用的。一旦实例化了一个类模板以创建一个 class ,它就与其他任何类一样。如果要写:
SomeOtherClass c; // Not a template
s.doSomething();
编译器知道应该以相同的方式分派到SomeOtherClass::doSomething
。