C++ 是在每个实例化上创建的模板类中每个方法的新版本

C++ Are new versions of every method in a template class created on every instantiation

本文关键字:新版本 方法 创建 实例化 C++      更新时间:2023-10-16

>我有一个类模板,它有两个参数,一个是类型名称,另一个是布尔值,用于确定如果遇到错误,类是否会抛出异常。

MyClass.h:

template<typename T, bool signal>
class MyClass {
    // methods which do not use or reference signal
    void Method1(args) {
        // some really long and complex code
    }
    void Method2(args) {
        // some more really long and complex code
    }
    // the method which checks the value of signal
    void throwMethod() {
        if (signal) throw (some exception); // if statement optimized away at compile time
    }
};

主.cpp:

#include "MyClass.h"
void main(int argc, const char * argv[]) {
    MyClass<int, true> instThrow;
    MyClass<int, false> instNoThrow;
    // do something
}

但并非此类中的每个方法都会抛出异常,实际上只有两个函数实际检查信号值,其余的根本不使用或引用此参数。我的问题是:类模板的每个方法(Method1,Method2)是否为新的实例化重新创建,其中只有信号参数不同(如上所示)(大多数方法未使用)或仅重新创建throwMethod(实际使用参数),如果是前者,那么它将导致不必要的Method1和Method2重复。

如果有任何区别,我的编译器是Apple LLVM编译器3.0

这些方法是为 ut 代码使用的类型参数的每个变体生成的。 若要避免这种情况,可以创建一个保存 Method1 和 Method2 的基类。 基类将仅将 T 作为模板参数,上面的类将仅从它继承。