非虚拟成员函数是否可以使用模板参数?
Can non-virtual member functions use template parameters?
我一直想知道,非虚拟成员函数可以使用模板参数吗?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
一样。
相关文章:
- 为什么 std::绑定错误参数可以成功?
- 是否可以在C++中有一个"generic"模板参数,该参数可以是非类型模板参数或类型?
- 是否可以使C++类成为Objc类的委托
- 是否可以使一个类成为两个不同层次结构的子类?
- 非类型引用参数可以在运行时修改,这是否意味着模板可以在运行时实例化?
- 根据模板参数可以选择静态的类成员
- C :宏参数可以在其中有空间吗?
- 为什么右值引用类型的模板参数可以绑定到左值类型?
- 是否有编译器标志可以使较新的 gcc 版本像旧版本一样构建
- C 可以使destuructor不称为班级成员和基类攻击方的灾难
- 转换构造函数的参数可以隐式转换吗?
- 函数参数可以是char*、long或int.可能吗
- 可以使未命名的结构静态
- 非类型模板参数可以是 "void*" 类型吗?
- 是否可以使整数仅收到一个单个数字而不是两个接收输入
- 为什么参数可以在对象初始化时通过赋值运算符传递给构造函数?
- C++:有哪些常规方法可以使代码更有效地用于大数字
- 是否可以使 std 容器使用默认运算符为新?
- 是否可以使函数接受给定参数的多种数据类型
- 是否可以使函数对于常量参数或变量参数的行为不同