【问题标题】:Can non-virtual member functions use template parameters?非虚成员函数可以使用模板参数吗?
【发布时间】:2018-06-25 10:39:08
【问题描述】:

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

例子:

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

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

}

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

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

【问题讨论】:

  • SomeClass 的不同实例化与任何类型的继承无关。它们只是不同的类。

标签: c++ templates polymorphism


【解决方案1】:

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

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

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

编译器将分派到SomeClass&lt;0&gt;::getValue。它不必在运行时调度,它对类型系统都是静态可用的。一旦一个类模板被实例化以创建一个,它就像任何其他类一样。如果你要写:

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

编译器知道它应该同样分派给SomeOtherClass::doSomething

【讨论】:

  • SomeClass *ptr = new SomeClass&lt;99&gt; 因此无效?
  • @JimmyB - 没有通用的SomeClass 基类。 C++ 模板与 Java 的泛型完全不同。它们是生成类的说明。除了来自同一个模板之外,这些类没有任何共同点。
猜你喜欢
  • 2011-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多