对于一个作业,我必须按照一些明确的说明编写一个矩阵类。其中一个指令是重载<<操作符,这样我们就可以正确地读取矩阵m的值:
m << 1,2,3,4,5,6;我试着查看带有变量参数的函数,但后来我发现不能用可变数量的参数重载操作符。
我尝试在std::initializer_list中查找,使用来自cpp参考的一些参考代码
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上给出了一个很好的答案之后,我试着把它合并起来,它的工作原理非常棒!
发布于 2015-11-03 01:57:58
<<比,具有更高的优先级,所以您的表达式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';
}https://stackoverflow.com/questions/33490124
复制相似问题