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

C++ 重载运算符+;=对于具有不同大小的非类型参数的模板,c++,templates,operator-overloading,C++,Templates,Operator Overloading,在我之前的一篇文章中(不要问我为什么创建一个新帐户),我问我的测试类是否正在创建一个VLA。委员会还提出: 一个(潜在的重大)问题是string\u test和 string\u test在m!=n 我可以通过创建一个新的字符串测试,并将大小添加到一起,轻松解决这个问题。但是对于operator+=这不起作用,因为大小(更准确地说,私有数据成员buffer[n])无法更改 template <typename U, size_t m> string_test<T, m + n&

在我之前的一篇文章中(不要问我为什么创建一个新帐户),我问我的测试类是否正在创建一个VLA。委员会还提出:

一个(潜在的重大)问题是
string\u test
string\u test
m!=n

我可以通过创建一个新的字符串测试,并将大小添加到一起,轻松解决这个问题。但是对于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);
}
模板
字符串测试运算符+(常量字符串测试和rhs)
{
char tmp[n+m];//不是VLA,编译时已知大小
strcpy(tmp,_缓冲区);
strcat(tmp、rhs.\U缓冲器);
返回make_字符串(tmp);
}

operator+=
应返回一个引用,并
*此
。实现
运算符+=
的方法是什么?

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


标准C++类是以相同的方式实现的,但是它不提供任何插入操作,因为它只是围绕静态数组的包装器。这意味着什么?你为什么要开一个新帐户?:)这不好。您声称问题在于

buffer
无法更改,但此代码中没有名为
buffer
的变量。另外,我认为调用
make_string
在这里没有什么用处。实际上,为什么你想要这样一个固定大小的字符串?因为我不确定您是否希望为固定大小的字符串类使用
+=
,除非它只是一个固定大小的缓冲区,在这种情况下
+=
不应导致不同的类型。在这两种情况下,都没有返回不同类型的
+=