#include <iostream>
#include <type_traits>
using namespace std;
struct Vector{};
struct SubVector{};
struct StrangeVector{};
template<class T> struct is_vector_type : false_type{};
template<> struct is_vector_type<Vector> : true_type{};
template<> struct is_vector_type<SubVector> : true_type{};
template<> struct is_vector_type<StrangeVector> : true_type{};
template <typename T1, typename T2>
typename std::enable_if<is_vector_type<T1>::value && is_vector_type<T2>::value, const Vector>::type
operator +(const T1 &t1, const T2 &t2){
cout << "Addiere 2 Vektoren\n";
return Vector();
}
template <typename T1, typename T2>
typename std::enable_if<is_vector_type<T1>::value && is_arithmetic<T2>::value, const Vector>::type
operator *(const T1 &t1, const T2 &t2){
cout << "Multipliziere einen Vektor mit einem zahlartigen Datentyp\n";
return Vector();
}
template <typename T1, typename T2>
typename std::enable_if<is_arithmetic<T1>::value && is_vector_type<T2>::value, const Vector>::type
operator *(const T1 &t1, const T2 &t2){
cout << "Multipliziere einen zahlartigen Datentyp mit einem Vektor auf clevere/faule Weise!\n";
return t2 * t1;
}
int main(){
6 * Vector();
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpzdHJ1Y3QgVmVjdG9ye307CnN0cnVjdCBTdWJWZWN0b3J7fTsKc3RydWN0IFN0cmFuZ2VWZWN0b3J7fTsKCnRlbXBsYXRlPGNsYXNzIFQ+IHN0cnVjdCBpc192ZWN0b3JfdHlwZSA6IGZhbHNlX3R5cGV7fTsKdGVtcGxhdGU8PiBzdHJ1Y3QgaXNfdmVjdG9yX3R5cGU8VmVjdG9yPiA6IHRydWVfdHlwZXt9Owp0ZW1wbGF0ZTw+IHN0cnVjdCBpc192ZWN0b3JfdHlwZTxTdWJWZWN0b3I+IDogdHJ1ZV90eXBle307CnRlbXBsYXRlPD4gc3RydWN0IGlzX3ZlY3Rvcl90eXBlPFN0cmFuZ2VWZWN0b3I+IDogdHJ1ZV90eXBle307Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgp0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxpc192ZWN0b3JfdHlwZTxUMT46OnZhbHVlICYmIGlzX3ZlY3Rvcl90eXBlPFQyPjo6dmFsdWUsIGNvbnN0IFZlY3Rvcj46OnR5cGUKb3BlcmF0b3IgKyhjb25zdCBUMSAmdDEsIGNvbnN0IFQyICZ0Mil7Cgljb3V0IDw8ICJBZGRpZXJlIDIgVmVrdG9yZW5cbiI7CglyZXR1cm4gVmVjdG9yKCk7Cn0KCnRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CnR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPGlzX3ZlY3Rvcl90eXBlPFQxPjo6dmFsdWUgJiYgaXNfYXJpdGhtZXRpYzxUMj46OnZhbHVlLCBjb25zdCBWZWN0b3I+Ojp0eXBlCm9wZXJhdG9yICooY29uc3QgVDEgJnQxLCBjb25zdCBUMiAmdDIpewoJY291dCA8PCAiTXVsdGlwbGl6aWVyZSBlaW5lbiBWZWt0b3IgbWl0IGVpbmVtIHphaGxhcnRpZ2VuIERhdGVudHlwXG4iOwoJcmV0dXJuIFZlY3RvcigpOwp9Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgp0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxpc19hcml0aG1ldGljPFQxPjo6dmFsdWUgJiYgaXNfdmVjdG9yX3R5cGU8VDI+Ojp2YWx1ZSwgY29uc3QgVmVjdG9yPjo6dHlwZQpvcGVyYXRvciAqKGNvbnN0IFQxICZ0MSwgY29uc3QgVDIgJnQyKXsKCWNvdXQgPDwgIk11bHRpcGxpemllcmUgZWluZW4gemFobGFydGlnZW4gRGF0ZW50eXAgbWl0IGVpbmVtIFZla3RvciBhdWYgY2xldmVyZS9mYXVsZSBXZWlzZSFcbiI7CglyZXR1cm4gdDIgKiB0MTsKfQoKaW50IG1haW4oKXsKCTYgKiBWZWN0b3IoKTsKfQo=