避免采用int参数的模板类的C ++爆炸性实例化

时间:2016-04-10 14:53:10

标签: c++ templates

我们说我有一个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';
        }            
};

这会导致重复的目标代码爆炸,唯一的区别是使用的常量NM,特别是如果我将这个copy方法用于有很多的对象不同的NM

由于该方法本身根本不依赖于M,是否有其他方法可以解决这个问题,以避免重复的目标代码爆炸?

1 个答案:

答案 0 :(得分:0)

总的来说,我认为C ++ 11引入了extern template来做到这一点:

  

显式实例化声明(extern模板)阻止   隐式实例化:否则会导致的代码   隐式实例化必须使用显式实例化   定义在程序的其他地方提供(通常,在   另一个文件:这可以用来减少编译时间)

但是,对于您的用例,您将为N和M的所有组合显式实例化Text :: copy,因此它似乎不可行,Dietmar的答案将是更好的选择。