From a478681120b9c1d2d8b62dde98fabde0eaee4149 Mon Sep 17 00:00:00 2001 From: "Randolph R. Settgast" Date: Mon, 16 Oct 2023 12:50:42 -0700 Subject: [PATCH 1/4] implementation of std::tuple_element that allows const auto [a,b] = tuple...added some unit testing as well --- include/camp/tuple.hpp | 4 ++-- test/tuple.cpp | 44 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 2 deletions(-) diff --git a/include/camp/tuple.hpp b/include/camp/tuple.hpp index f5001ea..acbc023 100644 --- a/include/camp/tuple.hpp +++ b/include/camp/tuple.hpp @@ -703,7 +703,7 @@ namespace std { template struct tuple_element> { - using type = decltype(camp::get(camp::tuple{})); + using type = ::camp::tuple_element_t>; }; /// This allows structured bindings to be used with camp::tagged_tuple @@ -718,7 +718,7 @@ namespace std { template struct tuple_element> { - using type = decltype(camp::get(camp::tagged_tuple{})); + using type = ::camp::tuple_element_t>; }; } // namespace std #endif diff --git a/test/tuple.cpp b/test/tuple.cpp index cde4bad..b8d25da 100644 --- a/test/tuple.cpp +++ b/test/tuple.cpp @@ -360,9 +360,53 @@ TEST(CampTuple, StructuredBindings) { auto t = camp::make_tuple(3, 9.9); auto [a, b] = t; + static_assert(std::is_same_v< decltype(a), int > ); + static_assert(std::is_same_v< decltype(b), double > ); ASSERT_EQ(a, 3); ASSERT_NEAR(b, 9.9, 1e-15); } + +TEST(CampTuple, StructuredBindingsConst) +{ + auto t = camp::make_tuple(3, 9.9); + const auto [a, b] = t; + static_assert(std::is_same_v< decltype(a), const int > ); + static_assert(std::is_same_v< decltype(b), const double > ); + ASSERT_EQ(a, 3); + ASSERT_NEAR(b, 9.9, 1e-15); +} + +TEST(CampTuple, StructuredBindingsRef) +{ + auto t = camp::make_tuple(3, 9.9); + auto & [a, b] = t; + static_assert(std::is_same< decltype(a), int >::value ); // Not an int & + static_assert(std::is_same< decltype(b), double >::value ); // Not a double & + std::cout<(t), 4); + ASSERT_NEAR(camp::get<1>(t), 10.1, 1e-15); +} + +TEST(CampTuple, StructuredBindingsRefConst) +{ + auto t = camp::make_tuple(3, 9.9); + const auto & [a, b] = t; + static_assert(std::is_same< decltype(a), const int >::value ); // Not an const int & + static_assert(std::is_same< decltype(b), const double >::value ); // Not a const double & + std::cout< Date: Mon, 16 Oct 2023 13:16:19 -0700 Subject: [PATCH 2/4] downgrade std::is_same_v to std::is_same<>::value --- test/tuple.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/tuple.cpp b/test/tuple.cpp index b8d25da..fe9bb6a 100644 --- a/test/tuple.cpp +++ b/test/tuple.cpp @@ -370,8 +370,8 @@ TEST(CampTuple, StructuredBindingsConst) { auto t = camp::make_tuple(3, 9.9); const auto [a, b] = t; - static_assert(std::is_same_v< decltype(a), const int > ); - static_assert(std::is_same_v< decltype(b), const double > ); + static_assert(std::is_same< decltype(a), const int >::value ); + static_assert(std::is_same< decltype(b), const double >::value ); ASSERT_EQ(a, 3); ASSERT_NEAR(b, 9.9, 1e-15); } From 2128a4de35b7c2b59956009912d70fa0280ac83b Mon Sep 17 00:00:00 2001 From: "Randolph R. Settgast" Date: Mon, 16 Oct 2023 13:17:55 -0700 Subject: [PATCH 3/4] downgrade std::is_same_v to std::is_same<>::value --- test/tuple.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/tuple.cpp b/test/tuple.cpp index fe9bb6a..6f507f0 100644 --- a/test/tuple.cpp +++ b/test/tuple.cpp @@ -360,8 +360,8 @@ TEST(CampTuple, StructuredBindings) { auto t = camp::make_tuple(3, 9.9); auto [a, b] = t; - static_assert(std::is_same_v< decltype(a), int > ); - static_assert(std::is_same_v< decltype(b), double > ); + static_assert(std::is_same< decltype(a), int >::value ); + static_assert(std::is_same< decltype(b), double >::value ); ASSERT_EQ(a, 3); ASSERT_NEAR(b, 9.9, 1e-15); } From b2593988dbcf382daf7152a9c8563bc5cd513e66 Mon Sep 17 00:00:00 2001 From: "Randolph R. Settgast" Date: Mon, 16 Oct 2023 13:48:09 -0700 Subject: [PATCH 4/4] removed some debugging output --- test/tuple.cpp | 7 ------- 1 file changed, 7 deletions(-) diff --git a/test/tuple.cpp b/test/tuple.cpp index 6f507f0..05dd3bf 100644 --- a/test/tuple.cpp +++ b/test/tuple.cpp @@ -382,7 +382,6 @@ TEST(CampTuple, StructuredBindingsRef) auto & [a, b] = t; static_assert(std::is_same< decltype(a), int >::value ); // Not an int & static_assert(std::is_same< decltype(b), double >::value ); // Not a double & - std::cout<::value ); // Not an const int & static_assert(std::is_same< decltype(b), const double >::value ); // Not a const double & - std::cout<