#include <iostream>
using namespace std;

struct a {
	a(int i = 0) : i(i) {}
	int i;
	friend ostream& operator <<(ostream& packet, const a *t);
	friend ostream& operator <<(ostream& packet, const a &t);
	friend ostream& operator <<(ostream& packet, a *t);
	friend ostream& operator <<(ostream& packet, a &t);
};

// Independent
ostream& operator <<(ostream& packet, const a &t)  {
	return (packet << t.i);
}

// Dependent ones
ostream& operator <<(ostream& packet, const a *t) {
	return (packet << (*t));
}

ostream& operator <<(ostream& packet, a &t) {
	return (packet << const_cast<const a &>(t));
}

ostream& operator <<(ostream& packet, a *t) {
	return (packet << const_cast<const a *>(t));
}

int main() {
	a rw(42);
	const a ro(35);
	cout << rw << endl;
	cout << &rw << endl;
	cout << ro << endl;
	cout << &ro << endl;
	return 0;
}