// a condition is not a condition until you say ::value // ::conditional_t picks a type. picking ::void and emitting it prints nothing at all ::emit< ::conditional_t< ::less<::difference<'B', 'A'>, ::difference<'A', 'A'>>::value, ::decltype(::difference<'Z', 'A'>), ::void > >::commit; // ::conditional does the same for values. this prints 9 ::emit< ::decltype( ::conditional< ::is_same<::remove_cv_t<::int32_t>, ::int32_t>::value, ::difference<'J', 'A'>, ::difference<'A', 'A'> > ) >::commit; // two arrays are the same type when their extents agree. this prints 1 ::emit< ::decltype( ::conditional< ::is_same< ::array<::byte, ::difference<'C', 'A'>>, ::array<::int32_t, ::sum<::difference<'B', 'A'>, ::difference<'B', 'A'>>> >::value, ::difference<'B', 'A'>, ::difference<'A', 'A'> > ) >::commit;