C++ 是在每个实例化上创建的模板类中每个方法的新版本
C++ Are new versions of every method in a template class created on every instantiation
>我有一个类模板,它有两个参数,一个是类型名称,另一个是布尔值,用于确定如果遇到错误,类是否会抛出异常。
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 作为模板参数,上面的类将仅从它继承。
相关文章:
- 为什么 odeint 在较新版本的 odeint 中失败?
- 新版本的 SDL 不允许我使用SDL_image
- 新版本的 g++ 与旧版本的 libstdc++
- 使用较新版本的 g++ 导致多线程性能下降?
- 将词法分析器字符串累加器移植到新版本的 Quex 时出现问题
- 如果您用新版本覆盖共享库(当前由程序映射)会发生什么
- C++自动更新到新版本
- 使用WinSparkle更新新版本后,它不会自动启动应用程序
- 在 gcc 4.4 上"pure virtual function called",但在较新版本或 clang 3.4 上不
- 较新版本的GCC抛出reinterpret_cast错误
- 为什么较新版本的C++不允许在类声明中定义纯方法?
- cmd 命令启动无法与新版本的 mingw32-make.exe一起使用?
- MFC ole服务器移植到较新版本 - afxgetThread返回null
- 将早期 MSVC 版本生成的代码重新生成为较新版本时可能遇到的问题
- C++ 是在每个实例化上创建的模板类中每个方法的新版本
- 将旧版本的MFC与新版本的Visual Studio一起使用
- 如何使用新版本的 Node Nan 持久化
- C++标准的新版本已经发布了吗
- 如何使用两个已安装的opencv的新版本进行构建
- 如果我用较新版本的gcc编译二进制文件,我如何找到需要在客户机linux机器上安装的库?