Поскольку вопрос помечен C ++ 11, в качестве альтернативы @PiotrSkotnicki, стоит упомянуть, что для достижения этого также можно использовать старый добрый рекурсивный пилинг переменных параметров:
template<typename T, typename... Rest>
struct Aggregate_add_impl {
static void add(T& dst, const T& lhs, const T& rhs) {
// intentional no-op
}
};
template<typename T, typename U, typename... Rest>
struct Aggregate_add_impl<T, U, Rest...> {
static void add(T& dst, const T& lhs, const T& rhs) {
U& dst_as_u = static_cast<U&>(dst);
const U& l_as_u = static_cast<const U&>(lhs);
const U& r_as_u = static_cast<const U&>(rhs);
dst_as_u = l_as_u + r_as_u;
Add_impl<T,Rest...>::add(dst, lhs, rhs);
}
};
template <typename... Ts>
Fooz<Ts...> operator+(const Fooz<Ts...>& lhs, const Fooz<Ts...>& rhs)
{
Fooz<Ts...> ret;
Aggregate_add_impl<Fooz<Ts...>, Ts...>::add(ret, lhs, rhs);
return ret;
}
Это также имеет то преимущество, что Fooz
не требуется, чтобы его можно было использовать для агрегирования (но оно ДОЛЖНО быть по умолчанию или копируемым).
Стоит отметить, что реализация operator+=
таким способом на самом деле немногоПроще, так что если у вас есть и +
, и +=
, просто используйте позднее.