#define MIXIN_TRAIT_TESTS #ifdef MIXIN_TRAIT_TESTS # include "mixin-traits.hpp" // the `impl' class provides a cast template through the CRTP pattern. // mixins don't do direct inheritance on themselves, // that's what mixin_traits::depends is for. namespace mixins::traits_detail { struct A {}; struct B {}; struct C {}; struct D {}; template<> struct mixin_traits { using depends = tuple<>; }; template<> struct mixin_traits { using depends = tuple; }; template<> struct mixin_traits { using depends = tuple; }; template<> struct mixin_traits { using depends = tuple; }; extern void test1(); void test1() { struct U : B, A {}; struct V : D {}; struct W : C, A {}; struct Q : virtual W, virtual D {}; //#define SHOULD_NOT_COMPILE #ifdef SHOULD_NOT_COMPILE (void)impl{}; // W not a mixin (void)impl{}; // A (void)impl{}; // D => C => A (void)impl{}; // D => C => A (void)impl{}; // B #else (void)impl{}; (void)impl{}; (void)impl{}; #endif } } // ns mixins::traits_detail #endif