2015-11-03 158 views
0

对于一个赋值,我必须按照一些明确的指令对矩阵类进行编码。其中一个指令是超载的< <操作,这样我们就可以读出值的矩阵m这个确切的方法:C++ 11 <<运算符specefic超载

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

我试图寻找到具有可变参数的功能,但后来我看到了,我可以”用可变数量的参数超载操作员。

我试图在寻找的std :: initializer_list,使用一些参考代码cpp reference

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的伟大答案后,我试图纳入,它的工作很好!

+1

这是学校课程的一个复杂任务。无论如何,查找“运营商超载代理类型逗号”,并有乐趣:) –

+0

谢谢我试图找到,我没有找到关于超载逗号的很多信息:s不幸 –

+1

你只是在寻找五分钟,但谷歌给“约218,000结果“为我为您提供的搜索字词。花更长一点的研究。 –

回答

3

<<,更高的优先级,以便你的表达m << 1,2,3,4,5,6所做的是:

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

在您需要m << 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'; 
} 
+0

感谢您的回答,我尽我所能了解您的代码(我不会说我现在就这么做),并运行一些测试以查看它是如何工作的:)!谢谢 –

+0

我试图将其用于我自己的代码中,其中有一个模板矩阵类和一个存储元素的向量,我将编辑我的问题以获得更清晰的代码以显示您 –

+0

非常感谢我收到了它!而且它现在可以在我的代码中正常工作!我想知道是否有可能与我的班级内部的操作员做一个版本 –