【问题标题】:Overloading operator+= for templates with non-type parameter of different sizes为具有不同大小的非类型参数的模板重载 operator+=
【发布时间】:2014-09-16 22:35:22
【问题描述】:

在我之前的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+= 应该返回一个引用和*thisoperator+=的实现方式是什么?

【问题讨论】:

  • 你想+=一个固定大小的数据结构?这甚至意味着什么?
  • 您为什么要创建一个新帐户? :) 这不好。
  • 您声称问题是buffer 无法更改,但此代码中没有名为buffer 的变量。此外,我认为调用make_string 在这里没有用处。
  • 其实,你为什么还要这样一个固定大小的字符串呢?因为我不确定你是否想要一个固定大小的字符串类的+=,除非它只是一个固定大小的缓冲区,在这种情况下,+= 应该 not 导致不同的类型。在这两种情况下,您都没有返回不同类型的+=

标签: c++ templates operator-overloading


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多