c++ - 如何在 C++ 中实现以逗号分隔的初始化,例如 Eigen 中的初始化?

标签 c++ initialization operator-overloading eigen

这是 Eigen 文档的一部分:

Matrix3f m;
m << 1, 2, 3,
     4, 5, 6,
     7, 8, 9;
std::cout << m;

输出:

1 2 3
4 5 6
7 8 9

我不明白上面的 operator<< 怎么能捕获所有逗号分隔的值。我做了一个小实验:

cout << "Just commas: ";
cout << 1, 2, 3, 4, 5;
cout << endl;
cout << "Commas in parentheses: ";
cout << ( 1, 2, 3, 4, 5 );
cout << endl;

可以预见(根据我对 C++ 语法的理解)只有一个值被 operator<< 捕获:

Just commas: 1
Commas in parentheses: 5

因此标题问题。

最佳答案

基本思想是重载 <<,运营商。

m << 1重载放置 1进入m然后返回一个特殊的代理对象——称之为p – 持有对 m 的引用.

然后 p, 2重载放置 2进入m并返回 p ,所以 p, 2, 3会先放2进入m然后 3 .

Boost.Assign 也使用了类似的技术, 虽然他们使用 +=而不是 << .

关于c++ - 如何在 C++ 中实现以逗号分隔的初始化,例如 Eigen 中的初始化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54173111/

相关文章:

c++ - 如何在 C++11 的迭代器中获取有关 auto 标识符的更多详细信息

c# - 初始化列表<>

ios - 类实例的所有存储属性必须在从初始化器抛出之前初始化

c++ - 为 find_if 重载函数调用运算符 ()

c++ - openCV 中的结果 compareHist

C++ Linux 与另一个程序交互 stdin/stdout

c++ - 比较两个用户定义的类型 vector

javascript - 属性未初始化...但它应该是?

c++ - QLinkedList算子+效率

c++ - 为什么我不能定义一个一元运算符,然后在 MSVC 的模板类中声明一个同名的友元二元运算符?