Ты почти понял. Как уже указывалось max66, используйте decltype
. Прежде всего, вы можете заменить свой класс PrecisionTransform
псевдонимом следующего типа (для этого вам нужно #include <utility>
):
template <typename Precision1, typename Precision2>
using TransformType = decltype(std::declval<Precision1>() * std::declval<Precision2>());
std::declval<XYZ>()
- это просто более общий способ сказать (Precision1)1
, который позволяет вам также использовать типы, у которых нет доступных конструкторов (в вашем случае это не имеет значения, поскольку вы используете только примитивы).
Ваш operator+
затем изменяется на:
template<typename Precision1, typename Precision2>
Unit<TransformType<Precision1, Precision2>> operator+(const Unit<Precision1>& x, const Unit<Precision2>& y)
{
return Unit<TransformType<Precision1, Precision2>>(x.value + y.value);
}
Обратите внимание, что вы получили опечатку в вашей версии operator+
(оба операнда использовали Precision1
).
Как вы можете видеть здесь , основные компиляторы согласны с этим.