重载运算符<<更改成员变量
overloading operator<< to change member variable
我有一个类,看起来像这样:
class A {
public:
A() {};
A& operator<< (A& a, unsigned int i);
private:
vector<int> abc;
}
我想提供使用操作符向abc
添加对象的能力:
A a();
a << 3,4,5; // should do the same as several calls of abc.push_back(i)
我知道我必须重载<<
运算符,我是否也必须重载,
运算符?
实际的方法是什么样子的?
永远不要重载c++中的,
操作符。语言允许这样做,但您不能在这样做的同时保留操作符的预期行为。(特别是,逗号操作符在c++中是一个序列点:编译器保证左表达式在右表达式之前求值。如果重载它,将不再保证哪个表达式将首先求值。
你想使用流插入操作符的多次调用来插入多个对象。
(为了完整起见:你永远不应该重载的另外两个c++操作符是&&
和||
。同样,不可能提供客户端代码所期望的行为(在这种情况下是短路)。
如果您想保留a << 1, 2, 3
的方面,您可以更改operator<<
的重载以接受int
的initializer_list
,而不是单个int
。
#include <initializer_list>
class A {
public:
A() {};
A& operator<< (std::initializer_list<int> values);
private:
vector<int> abc;
}
然后实现如下:
A& A::operator<< (std::initializer_list<int> values)
{
for(const auto& value : values)
abc.push_back(value);
return *this;
}
并按如下方式使用:
A a;
a << {1, 2, 3, 4};
你唯一需要确保的是你有一个兼容c++ 11的编译器来提供这些特性
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;
};
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 助记符和指向成员语法的指针
- 用于访问容器<T>数据成员的正确 API
- 内置函数可查看CPP中的成员变量
- 是否可以初始化不可复制类型的成员变量(或基类)
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 嵌套在类中时无法设置成员数据
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 将函数类成员映射到类本身内部
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 将Ref对象作为类成员
- 将包含C样式数组的对象初始化为成员变量(C++)
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 将公共但非静态的成员函数与ALGLIB集成
- C++分离成员流重载<<
- 重载运算符<<输出地址而不是数据成员