首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c++11算子的<<谱过载

c++11算子的<<谱过载
EN

Stack Overflow用户
提问于 2015-11-03 01:47:28
回答 1查看 47关注 0票数 0

对于一个作业,我必须按照一些明确的说明编写一个矩阵类。其中一个指令是重载<<操作符,这样我们就可以正确地读取矩阵m的值:

代码语言:javascript
复制
m << 1,2,3,4,5,6;

我试着查看带有变量参数的函数,但后来我发现不能用可变数量的参数重载操作符。

我尝试在std::initializer_list中查找,使用来自cpp参考的一些参考代码

代码语言:javascript
复制
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 53上给出了一个很好的答案之后,我试着把它合并起来,它的工作原理非常棒!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-03 01:57:58

<<,具有更高的优先级,所以您的表达式m << 1,2,3,4,5,6所做的是:

代码语言:javascript
复制
((((((m << 1), 2), 3), 4), 5), 6)

换句话说,您需要m << 1返回一个对象,该对象表示已在1中读取并准备在2中读取的操作。这类事情通常是用所谓的“表达式模板”来完成的,尽管在您的情况下,您并不需要模板。

您的用法有一个不同之处,您确实需要在执行过程中修改对象,而通常的表达式模板则是懒洋洋地操作,直到它们的对象被转换为最终结果类型之后才能真正完成工作。

代码语言:javascript
复制
#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';
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33490124

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档