Eigen 库实现了这种语法。不确定那是不是你来自的地方。
Eigen 是一个表达式模板库。它定义了看似做事的运算符和函数,但它们只是代理对象的工厂。代理形成编译时,有时是运行时数据结构,它们决定何时以及如何进行计算。
要实现这种语法,您需要代理对象。将其类似于std::ostream
. a << 3
返回一个代理“流”对象,然后重载operator ,
以启用该, 4, 5
部分。代理也可以重载operator<<
,在这种情况下,语法为a << 3 << 4 << 5
. 这可以说是更干净,但是 Eigen 是一个数学和运算符重载密集型库,并且,
作为最低优先级运算符具有特殊的地位,这减少了在诸如a << 3, true? 4 : 42, 5
.
长话短说,operator<<
即使你这样做,你也应该坚持下去。
class A {
public:
A() {};
inserter operator << (A& a, unsigned int i) {
inserter ret( * this );
ret , i;
return ret;
}
private:
vector<int> abc;
struct inserter {
A &client;
inserter( A &in_client ) : client( in_client ) {}
inserter &operator , ( int x ) {
client.abc.push_back( x );
return this;
}
};
friend struct inserter;
};