Skip to content

Commit 0b4dc20

Browse files
author
Yaraslau Tamashevich
committed
Add another CallOnMembers
1 parent 3d30b49 commit 0b4dc20

File tree

3 files changed

+14
-2
lines changed

3 files changed

+14
-2
lines changed

CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
cmake_minimum_required(VERSION 3.10)
2-
project(reflection-cpp VERSION 0.3.0 LANGUAGES CXX)
2+
project(reflection-cpp VERSION 0.3.1 LANGUAGES CXX)
33
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
44

55
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

include/reflection-cpp/reflection.hpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1264,12 +1264,19 @@ constexpr void EnumerateMembers(Callable&& callable)
12641264
}
12651265

12661266
template <typename Object, typename Callable>
1267-
requires std::same_as<void, std::invoke_result_t<Callable, std::string, MemberTypeOf<0, Object>>>
1267+
requires std::is_invocable_v<Callable, std::string, MemberTypeOf<0, Object>>
12681268
void CallOnMembers(Object& object, Callable&& callable)
12691269
{
12701270
EnumerateMembers(object, [&]<size_t I, typename T>(T&& value) { callable(MemberNameOf<I, Object>, value); });
12711271
}
12721272

1273+
template <typename Object, typename Callable>
1274+
requires std::is_invocable_v<Callable, MemberTypeOf<0, Object>>
1275+
void CallOnMembers(Object& object, Callable&& callable)
1276+
{
1277+
EnumerateMembers(object, [&]<size_t I, typename T>(T&& value) { callable.template operator()<I>(value); });
1278+
}
1279+
12731280
/// Folds over the members of a type without an object of it.
12741281
///
12751282
/// @param initialValue The initial value to fold with

test-reflection-cpp.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,11 @@ TEST_CASE("single value record", "[reflection]")
7878
CHECK(name == "value");
7979
CHECK(value == 42);
8080
});
81+
82+
Reflection::CallOnMembers(s, []<size_t I, typename T>(T&& value) {
83+
CHECK(I == 0);
84+
CHECK(value == 42);
85+
});
8186
}
8287

8388
TEST_CASE("core", "[reflection]")

0 commit comments

Comments
 (0)