c++ - 为具有不同大小的非类型参数的模板重载 operator+=

标签 c++ templates operator-overloading

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

One (potentially significant) wrinkle is that string_test<T, m> and string_test<T, n> are different types when m != n.

我可以通过创建一个将大小相加的新 string_test 轻松解决此问题。但对于 operator+= 这不起作用,因为大小(更准确地说,私有(private)数据成员 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> 以相同的方式实现,但它不提供任何会增加大小的插入操作,因为它只是一个静态大小数组的包装器。

关于c++ - 为具有不同大小的非类型参数的模板重载 operator+=,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25879482/

相关文章:

c++ - 而vs对于陈述的不同行为

c++ - 理解这个 Scala 代码

Azure ARM模板“找不到名称为hostingEnvironment

c++ - 类指针类和 ->* 运算符

C++:operator<< 嵌套类中的重载

Swift 中类似 Python 的运算符重载

c++ - 如何使用 C++ 仿函数实现 "Connections"

C++ 递归可变参数 Lambda

javascript - Zepto JS : CSS doesn't apply to basic HTML template

c++ - 如何从文件重建 BST