#include #include #include using namespace std; class Base {}; ostream& operator << ( ostream& o, const Base& b) { o << "Base\n"; return o; } class C : public Base {}; class D : public Base {}; template void operator + (const T& t , const Base& b ) { cout << "t+ " << t << "\n"; } template void operator + (const Base& b, const T& t ) { cout << "+t " << t << "\n"; } template void operator * (const T& t , const Base& b ) { cout << "t* " << t << "\n"; } template typename boost::disable_if, void>::type operator * (const Base& b, const T& t ) { cout << "*t " << t << "\n"; } void test() { C c; D d; c+3; 5+d; // c+d; // Compile time error c*3; 5*d; c*d; } #include #include #include void test2() { using namespace boost::numeric::ublas; matrix A(3,3); matrix B(3,3); A = B = zero_matrix(3,3); A(0,0) = 3.0; B(0,0) = 3.0; cout << A*B << "\n"; }