Der Code compiliert wirklich ;)
constexpr Human o_0{Getraenke::KAFFEE, Essen::Gurkensalat};
static_assert(not mix(o_0.getraenk, o_0.essen));
static_assert(not is_convertible<Getraenke, Essen>());
static_assert(not mix(Getraenke::KAFFEE, Essen::Gurkensalat));
Background noise:
#include <type_traits>
#include <cassert>
using namespace std;
enum class Getraenke { NICHTS, KAFFEE };
enum class Lieferdienst { VOID };
enum class Essen { Gurkensalat };
struct Human {
Getraenke getraenk;
Essen essen;
Lieferdienst lieferdienst;
};
// Niemals Kaffee mit irgendwas mischen
template<class T1>
constexpr inline
auto KAFFEEMixX(T1 x) {
return false;
}
// Nur Kaffee mit ausgewaehlte Getraenke mischen
template<>
constexpr inline
auto KAFFEEMixX<Essen>(Essen essen) {
switch(essen) {
case Essen::Gurkensalat: return false;
default: return false;
}
}
// Niemals irgendwas mit irgendwas vermischen
template<class T1, class T2>
constexpr inline
auto mix(T1 x, T2 y) {
return false;
}
// Nur Ausgewaehlte Getraenke und Essen mischen
template<>
constexpr inline
auto mix(Getraenke getraenk, Essen essen) {
switch(getraenk) {
case Getraenke::KAFFEE: return KAFFEEMixX(essen);
default: return false;
};
}