Просто вычислите ваш новый тип в операторе + тип возвращаемого значения и используйте MPL для сравнения. Кроме того, вам не нужен друг, для этого ни ваш оператор + не должен быть изменяемым.
Простой пример с простыми классами:
#include <boost/mpl/max.hpp>
template<unsigned char B, unsigned char F>
class Foo
{};
template< unsigned char B1, unsigned char F1
, unsigned char B2, unsigned char F2
>
Foo< boost::mpl::max_<boost::mpl_::char_<B1>, boost::mpl_::char_<B2> >::value
, boost::mpl::max_<boost::mpl_::char_<F1>, boost::mpl_::char_<F2> >::value
>
operator+(Foo<B1,F1> const& a, Foo<B2,F2> const& b)
{
Foo< boost::mpl::max_<boost::mpl_::char_<B1>, boost::mpl_::char_<B2> >::value
, boost::mpl::max_<boost::mpl_::char_<F1>, boost::mpl_::char_<F2> >::value
> that;
return that;
}
Теперь обратите внимание, насколько это громоздко.Обычной идиомой в этом случае является использование интегральных типов MPL вместо необработанных значений, когда это возможно
#include <boost/mpl/max.hpp>
template<class B, class F>
class Foo
{};
template< class B1, class F1
, class B2, class F2
>
Foo< typename boost::mpl::max_<B1, B2>::type
, typename boost::mpl::max_<F1, F2>::type
>
operator+(Foo<B1,F1> const& a, Foo<B2,F2> const& b)
{
Foo< typename boost::mpl::max_<B1, B2>::type
, typename boost::mpl::max_<F1, F2>::type
> that;
return that;
}
Foo< boost::mpl::int_<4>, boost::mpl::int_<8> > x;
РЕДАКТИРОВАТЬ: Кроме того, это делает возвращаемый тип + немного сложным для записи в pre_C ++ 11авто.Еще одна классическая вещь - сделать это функциональным объектом по протоколу result_of, чтобы у вас была удобная мета-функция для непрозрачного вычисления возвращаемого типа.