2
0
mirror of https://github.com/boostorg/pfr.git synced 2026-01-19 04:22:13 +00:00

Return std::array<std::string_view, 0> type for boost::pfr::names_as_array(empty_struct{}) (fixes #195)

This commit is contained in:
Antony Polukhin
2025-05-12 17:40:43 +03:00
parent b95fd86595
commit f004e91c9b
3 changed files with 14 additions and 18 deletions

View File

@@ -83,8 +83,7 @@ auto
names_as_array() noexcept {
return detail::make_stdarray_from_tietuple(
detail::tie_as_names_tuple<T>(),
detail::make_index_sequence< tuple_size_v<T> >(),
1L
detail::make_index_sequence< tuple_size_v<T> >()
);
}

View File

@@ -12,29 +12,18 @@
#include <boost/pfr/detail/sequence_tuple.hpp>
#if !defined(BOOST_PFR_INTERFACE_UNIT)
#include <utility> // metaprogramming stuff
#include <array>
#include <type_traits> // for std::common_type_t
#include <cstddef>
#include <string_view>
#include <utility> // metaprogramming stuff
#endif
namespace boost { namespace pfr { namespace detail {
template <class... Types>
constexpr auto make_stdarray(const Types&... t) noexcept {
return std::array<std::common_type_t<Types...>, sizeof...(Types)>{t...};
}
template <class T, std::size_t... I>
constexpr auto make_stdarray_from_tietuple(const T& t, std::index_sequence<I...>, int) noexcept {
return detail::make_stdarray(
constexpr auto make_stdarray_from_tietuple(const T& t, std::index_sequence<I...>) noexcept {
return std::array<std::string_view, sizeof...(I)>{
boost::pfr::detail::sequence_tuple::get<I>(t)...
);
}
template <class T>
constexpr auto make_stdarray_from_tietuple(const T&, std::index_sequence<>, long) noexcept {
return std::array<std::nullptr_t, 0>{};
};
}
}}} // namespace boost::pfr::detail

View File

@@ -131,6 +131,13 @@ void test_names_as_array_for_empty() {
BOOST_TEST_EQ(value.empty(), true);
}
void test_names_as_array_iteration_for_empty() {
const auto names = boost::pfr::names_as_array<empty>();
for (std::string_view name : names) {
BOOST_ERROR("`names` must be empty");
}
}
} // namespace testing
int main() {
@@ -141,6 +148,7 @@ int main() {
testing::test_names_as_array();
testing::test_names_as_array_without_linkage();
testing::test_names_as_array_for_empty();
testing::test_names_as_array_iteration_for_empty();
return boost::report_errors();
}