我们说我有一个C ++类:
template<int N>
class Text {
public:
Text() { }
char _buf[N];
};
它只是封装了一个C字符串。
现在,让我们说我写了一个方法,它将使用另一个Text
对象,其长度为M
,并将其内容复制到此对象中。
template<int N>
class Text {
public:
Text() { }
char _buf[N];
template<int M> void copy(const Text<M> &t) {
strncpy(_buf, t.cstr(), N - 1);
_buf[N - 1] = '\0';
}
};
这会导致重复的目标代码爆炸,唯一的区别是使用的常量N
和M
,特别是如果我将这个copy
方法用于有很多的对象不同的N
和M
?
由于该方法本身根本不依赖于M
,是否有其他方法可以解决这个问题,以避免重复的目标代码爆炸?
答案 0 :(得分:0)
总的来说,我认为C ++ 11引入了extern template
来做到这一点:
显式实例化声明(extern模板)阻止 隐式实例化:否则会导致的代码 隐式实例化必须使用显式实例化 定义在程序的其他地方提供(通常,在 另一个文件:这可以用来减少编译时间)
但是,对于您的用例,您将为N和M的所有组合显式实例化Text :: copy,因此它似乎不可行,Dietmar的答案将是更好的选择。