对于具有不同大小的非类型参数的模板,重载operator + =

时间:2014-09-16 22:35:23

标签: c++ templates operator-overloading

在我以前的question(不要问为什么我开了一个新帐户)我问我的测试类是否正在创建一个VLA。 answerer也提出了这个问题:

  

一个(可能很重要的)皱纹是string_test<T, m>和   string_test<T, n>m != n是不同的类型。

我可以通过创建一个添加了大小的新string_test来轻松解决这个问题。但是对于operator + =这不起作用,因为大小(更准确地说,私有数据成员buffer[n])不能改变。

template <typename U, size_t m>
string_test<T, m + n> operator+(const string_test<U, m>& rhs)
{
    char tmp[n + m]; // not VLA, size known at compile-time
    strcpy(tmp, _buffer);
    strcat(tmp, rhs._buffer);
    return make_string(tmp);
}

operator+=应该返回引用*this。什么是实施operator+=的方式?

1 个答案:

答案 0 :(得分:1)

通过使该类型的大小分开,您已告诉您班级的用户该字符串的大小为 static (即无法更改)。此问题类似于简单的C样式数组(int x[n])。元素不能添加到数组中,而是必须创建一个新的缓冲区,它可以保存前面的元素+额外的元素。

标准C ++数组类std::array<T, N>以相同的方式实现,但它不提供任何会增加大小的插入操作,因为它只是一个静态大小的数组的包装。