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

时间:2018-06-25 10:39:08

标签: c++ templates polymorphism

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

示例:

template<int N>
class SomeClass
{
public:
    SomeClass() {}

    // Can this function be non-virtual?
    int getValue() {
      return N;
    }

}

如果我理解正确,则编译器基本上将为每个模板参数 value 生成一个类。在上面的示例中,将衍生自SomeClass隐式生成的多个类(每个N值一个)。因此,据我所知,getValue()将需要根据实际(运行时)类型动态地分派(到函数的不同实例)。

我知道编译器不会将这些函数强制为虚拟的,但是它可以做一些魔术吗?或者我真的必须使该函数虚拟为具有正确的实例,例如通过指针?

1 个答案:

答案 0 :(得分:2)

  

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

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

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

编译器将分派到SomeClass<0>::getValue。它不必在运行时调度,它对于类型系统是静态可用的。一旦实例化了一个类模板以创建一个 class ,它就与其他任何类一样。如果要写:

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

编译器知道应该以相同的方式分派到SomeOtherClass::doSomething