Чтобы успокоить VC ++, вы можете извлечь возвращаемый тип в качестве другого аргумента шаблона.
template<typename ValueType, typename RetType = decltype(ValueType{} == ValueType{})>
RetType Compare(const ValueType& value, const ValueType& expected)
{
return value == expected;
}
template<>
decltype(float{} == float{}) Compare<float>(const float& value, const float& expected)
{
return std::abs(value - expected) < 1e-4F;
}
Это заставляет VC ++ принимать код.