I think you misunderstood.
The actual evaluation of constant expressions is done by the compiler, not the preprocessor. The preprocessor evaluates only macros that relate to textual substitution.
Boost.Preprocessor, , , , if , .
BOOST_PP_ADD(4, 3)
BOOST_PP_SUB(4, 3)
, , ( ):
#define ADD_IMPL_4_3 7
#define BOOST_PP_ADD(lhs, rhs) ADD_IMPL_##lhs##_##rhs
, , ;)
, , .
template <int x> struct f {};
typedef f< 3*4 / 5 > super_f_type;
, ... !
: BOOST_PP_ADD , , > BOOST_PP_ADD(BOOST_PP_SUB(4,3),3).