C++Guns – RoboBlog

13.03.2017

Fun with C++ syntax

Filed under: — Thomas @ 14:03

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;
   };
 }

No Comments

No comments yet.

RSS feed for comments on this post.

Sorry, the comment form is closed at this time.

Powered by WordPress