重载运算符+=,用于具有不同大小的非类型参数的模板

Overloading operator+= for templates with non-type parameter of different sizes

本文关键字:类型参数 运算符 用于 重载      更新时间:2023-10-16

在我之前的问题中(不要问我为什么要创建一个新帐户(,我问我的测试类是否正在创建VLA。回答者也提出了这个问题:

一个(潜在的重要(皱纹是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+=的方法?

通过将类型的大小分开,您已经告诉类的用户字符串的大小是静态的(即不能更改(。这个问题类似于一个简单的C样式数组(int x[n](。元素不能添加到数组中,相反,必须创建一个新的缓冲区来容纳前面的元素 + 额外的元素。

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