【问题标题】:c++11 specefic overload of << operatorc++11 << 运算符的特定重载
【发布时间】:2015-11-03 01:47:28
【问题描述】:

对于作业,我必须按照一些明确的说明编写矩阵类。其中一条指令是重载

m << 1,2,3,4,5,6;

我尝试查看带有可变参数的函数,但后来我发现我无法使用可变数量的参数重载运算符。

我尝试使用来自cpp reference 的一些参考代码查看 std::initializer_list

std::vector<float> mat;


Mat<M,N>& operator<<(std::initializer_list<float> l)
{
    this->mat.insert(this->mat.begin(),l.begin(),l.end());

    return *this;
}

所以我的问题是,我可以使用什么类/类型的参数来实现这一点,我想到的选项不起作用,或者我没有正确使用它们。

非常感谢。

编辑: 在@bames53 给出很好的回答后,我尝试合并,效果很好!

【问题讨论】:

  • 对于学校班级来说,这是一项复杂的作业。无论如何,查找“运算符重载代理类型逗号”并玩得开心:)
  • 谢谢我试着调查一下,我没有找到太多关于重载逗号的信息:s 不幸的是
  • 您只查找了五分钟,但 Google 为我为您提供的搜索字词提供了“大约 218,000 个结果”。花点时间研究一下。

标签: c++ c++11 operator-overloading parameter-passing


【解决方案1】:

&lt;&lt; 的优先级高于,,所以你的表达式m &lt;&lt; 1,2,3,4,5,6 所做的是:

((((((m << 1), 2), 3), 4), 5), 6)

换句话说,您需要m &lt;&lt; 1 返回一个对象,该对象表示已读入1 并准备读入2 的操作。这种事情通常是用一种叫做“表达式模板”的东西来完成的,尽管在你的情况下你并不真的需要模板。

您的用法将有一个不同之处在于您确实需要在进行过程中修改对象,而通常的表达式模板操作是惰性的,等到它们的对象转换为最终结果类型后才真正开始工作。

#include <iostream>

// a type to do something with
struct M { int i; };

// a type to represent the operations
struct Input_operation { M &m; int count; };


Input_operation operator << (M &m, int i) {
  m.i = i;
  return {m, 1};
}

Input_operation operator , (Input_operation op, int i) {
  op.m.i += i;
  op.count++;
  return op;
}

int main() {
  M m;
  m << 1, 2, 3, 4, 5, 6;
  std::cout << m.i << '\n';
}

【讨论】:

  • 感谢您的回答,我正在尽最大努力理解您的代码(我现在不会说),并运行一些测试以查看它是如何工作的 :) !谢谢
  • 我尝试将其用于我自己的代码中,其中我有一个模板矩阵类和一个存储元素的向量,我将编辑我的问题以获得更简洁的代码来展示给你
  • 非常感谢,我明白了!现在它在我的代码中运行良好!我想知道是否可以用我班级内部的操作员制作一个版本
  • @BobMaza 重载运算符可以定义为成员函数,但在许多情况下您可以使用shouldn't
猜你喜欢
  • 2012-07-05
  • 2013-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多