diff --git a/boost_multiprecision.props b/boost_multiprecision.props
index cc3a72c69c..99870093f6 100644
--- a/boost_multiprecision.props
+++ b/boost_multiprecision.props
@@ -6,6 +6,7 @@
$(SolutionDir)..\Boost\multiprecision\include;%(AdditionalIncludeDirectories)
+ BOOST_MP_STANDALONE;%(PreprocessorDefinitions)
diff --git a/functions/functions.vcxproj b/functions/functions.vcxproj
index 760525bf4f..766d73c873 100644
--- a/functions/functions.vcxproj
+++ b/functions/functions.vcxproj
@@ -4,11 +4,6 @@
{7cca653c-2e8f-4ffd-9e9f-bee590f3efab}
functions
-
-
- BOOST_MP_STANDALONE;%(PreprocessorDefinitions)
-
-
diff --git a/numerics/polynomial_in_monomial_basis_body.hpp b/numerics/polynomial_in_monomial_basis_body.hpp
index 57624f058f..7403488ad8 100644
--- a/numerics/polynomial_in_monomial_basis_body.hpp
+++ b/numerics/polynomial_in_monomial_basis_body.hpp
@@ -12,7 +12,7 @@
#include "absl/strings/str_cat.h"
#include "absl/strings/str_join.h"
#include "base/not_constructible.hpp"
-#include "boost/multiprecision/fwd.hpp"
+#include "boost/multiprecision/number.hpp"
#include "geometry/cartesian_product.hpp"
#include "geometry/serialization.hpp"
#include "numerics/combinatorics.hpp"
diff --git a/quantities/concepts.hpp b/quantities/concepts.hpp
index 580487434b..6b7721fabb 100644
--- a/quantities/concepts.hpp
+++ b/quantities/concepts.hpp
@@ -15,6 +15,8 @@ using namespace base::_traits;
using namespace quantities::_quantities;
// TODO(egg): additive_group should subsume affine, but we use it there.
+// We use |convertible_to| here because we want this concept to work with
+// Boost multiprecision types which heavily use implicit conversions.
template
concept additive_group = requires(G x, G y, int n) {
G{};
@@ -34,10 +36,10 @@ concept additive_group = requires(G x, G y, int n) {
template
concept affine = requires(A x, A y) {
{ x - y } -> additive_group;
- { y + (x - y) } -> std::convertible_to;
- { y += (x - y) } -> std::convertible_to;
- { y - (x - y) } -> std::convertible_to;
- { y -= (x - y) } -> std::convertible_to;
+ { y + (x - y) } -> std::same_as;
+ { y += (x - y) } -> std::same_as;
+ { y - (x - y) } -> std::same_as;
+ { y -= (x - y) } -> std::same_as;
};
// A graded ring restricted to its homogeneous elements; multiplication can
@@ -48,13 +50,13 @@ concept homogeneous_ring =
// Really, multiplication should return a homogeneous_ring.
{ x * y } -> additive_group;
{ (x * y) * z } -> additive_group;
- { (x * y) * z } -> std::convertible_to;
+ { (x * y) * z } -> std::same_as;
};
template
concept ring = homogeneous_ring && requires(A x, A y) {
- { x * y } -> std::convertible_to;
- { x *= y } -> std::convertible_to;
+ { x * y } -> std::same_as;
+ { x *= y } -> std::same_as;
};
// TODO(egg): field should subsume homogeneous_field, but we use it in
@@ -63,9 +65,9 @@ concept ring = homogeneous_ring && requires(A x, A y) {
template
concept field = ring && !std::integral && requires(K x, K y, K z) {
{ 1 } -> std::convertible_to;
- { 1 / y } -> std::convertible_to;
- { x / y } -> std::convertible_to;
- { x /= y } -> std::convertible_to;
+ { 1 / y } -> std::same_as;
+ { x / y } -> std::same_as;
+ { x /= y } -> std::same_as;
};
// TODO(egg): vector_space should subsume homogeneous_vector_space, but we use
@@ -73,11 +75,11 @@ concept field = ring && !std::integral && requires(K x, K y, K z) {
template
concept vector_space = field && requires(K λ, V v) {
- { λ * v } -> std::convertible_to;
- { v * λ } -> std::convertible_to;
- { v / λ } -> std::convertible_to;
- { v *= λ } -> std::convertible_to;
- { v /= λ } -> std::convertible_to;
+ { λ * v } -> std::same_as;
+ { v * λ } -> std::same_as;
+ { v / λ } -> std::same_as;
+ { v *= λ } -> std::same_as;
+ { v /= λ } -> std::same_as;
};
// A graded field restricted to its homogeneous elements; multiplication and
@@ -88,9 +90,9 @@ concept homogeneous_field = homogeneous_ring && requires(K x, K y, K z) {
{ x / y } -> field;
requires vector_space;
{ (1 / x) } -> homogeneous_ring;
- { 1 / (x * y) } -> std::convertible_to;
- { (x * y) / z } -> std::convertible_to;
- { (x / y) * z } -> std::convertible_to;
+ { 1 / (x * y) } -> std::same_as;
+ { (x * y) / z } -> std::same_as;
+ { (x / y) * z } -> std::same_as;
};
template
@@ -99,11 +101,11 @@ concept homogeneous_vector_space =
// Really, these operations should return a homogeneous_vector_space.
requires vector_space;
{ λ * v } -> additive_group;
- { v * λ } -> std::convertible_to;
+ { v * λ } -> std::same_as;
{ v / λ } -> additive_group;
- { λ * v / λ } -> std::convertible_to;
+ { λ * v / λ } -> std::same_as;
{ (λ * μ) * v } -> additive_group;
- { λ * (μ * v) } -> std::convertible_to;
+ { λ * (μ * v) } -> std::same_as;
};
template
@@ -118,7 +120,7 @@ template
concept real_affine_space = affine_space;
template
-concept quantity = instance || std::convertible_to;
+concept quantity = instance || std::same_as;
// std::integral || std::floating_point rather than
// std::convertible_to because
diff --git a/quantities/elementary_functions.hpp b/quantities/elementary_functions.hpp
index 4e2d6b817d..0a09449bb6 100644
--- a/quantities/elementary_functions.hpp
+++ b/quantities/elementary_functions.hpp
@@ -2,7 +2,7 @@
#include
-#include "boost/multiprecision/fwd.hpp"
+#include "boost/multiprecision/number.hpp"
#include "quantities/named_quantities.hpp"
#include "quantities/quantities.hpp"
diff --git a/quantities/elementary_functions_body.hpp b/quantities/elementary_functions_body.hpp
index f1cd9ab58e..0da6aa541c 100644
--- a/quantities/elementary_functions_body.hpp
+++ b/quantities/elementary_functions_body.hpp
@@ -7,7 +7,6 @@
#include
#include "boost/multiprecision/cpp_int.hpp"
-#include "boost/multiprecision/fwd.hpp"
#include "numerics/cbrt.hpp"
#include "numerics/fma.hpp"
#include "numerics/next.hpp"
diff --git a/quantities/generators_body.hpp b/quantities/generators_body.hpp
index edc77f07bd..1b214ee96a 100644
--- a/quantities/generators_body.hpp
+++ b/quantities/generators_body.hpp
@@ -5,7 +5,7 @@
#include
#include "base/not_constructible.hpp"
-#include "boost/multiprecision/fwd.hpp"
+#include "boost/multiprecision/number.hpp"
#include "quantities/dimensions.hpp"
namespace principia {
diff --git a/quantities/quantities.hpp b/quantities/quantities.hpp
index f9380a86de..a1e46eecb4 100644
--- a/quantities/quantities.hpp
+++ b/quantities/quantities.hpp
@@ -12,7 +12,7 @@
#include "base/not_constructible.hpp"
#include "base/not_null.hpp"
#include "base/tags.hpp"
-#include "boost/multiprecision/fwd.hpp"
+#include "boost/multiprecision/number.hpp"
#include "quantities/dimensions.hpp"
#include "quantities/generators.hpp"
#include "serialization/quantities.pb.h"