#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();
}
