1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| #include <type_traits>
#include <iostream>
using namespace std;
typedef enum{
Add,
Mult,
} Expression;
typedef struct {} EA;
typedef struct {} EB;
template<class L,class R, Expression E> class Expr;
template<class L,class R>
class Expr<L,R,Mult>
{
public:
Expr(const L& left, const R& right, const EA& dummy){}
inline void exec(){ cout << "class\n"; }
};
template<class L,class R>
class Expr<L,R,Mult>
{
public:
Expr(const L& left, const R& right, const EB& dummy){}
inline void exec(){ cout << "arithmetic\n"; }
};
template<class L,class R>
inline Expr<L,R,Mult> operator*(const L& left, const R& right){
return Expr<L,R,Mult>(left, right, typename conditional<is_class<L>::value && is_class<R>::value, EA, EB>::type());
}
class A{
public:
A(){}
};
int main(){
A a;
int x = 3;
float y = 0.5;
(a*a).exec();
(a * x).exec();
(y * a).exec();
return 0;
} |
Partager