@@ -316,6 +316,10 @@ namespace matchit
316316#include < type_traits>
317317#include < variant>
318318
319+ #if !defined(NO_SCALAR_REFERENCES_USED_IN_PATTERNS)
320+ #define NO_SCALAR_REFERENCES_USED_IN_PATTERNS 0
321+ #endif // !defined(NO_SCALAR_REFERENCES_USED_IN_PATTERNS)
322+
319323namespace matchit
320324{
321325 namespace impl
@@ -876,8 +880,11 @@ namespace matchit
876880 // support constexpr.
877881 template <typename Value>
878882 using AppResultCurTuple =
879- std::conditional_t <std::is_lvalue_reference_v<AppResult<Value>> ||
880- std::is_scalar_v<AppResult<Value>>,
883+ std::conditional_t <std::is_lvalue_reference_v<AppResult<Value>>
884+ #if NO_SCALAR_REFERENCES_USED_IN_PATTERNS
885+ || std::is_scalar_v<AppResult<Value>>
886+ #endif // NO_SCALAR_REFERENCES_USED_IN_PATTERNS
887+ ,
881888 std::tuple<>,
882889 std::tuple<std::decay_t <AppResult<Value>>>>;
883890
@@ -1844,16 +1851,16 @@ namespace matchit
18441851 std::tuple<>>);
18451852 constexpr auto x = [](auto &&t)
18461853 { return t; };
1847- static_assert (std::is_same_v<PatternTraits<App<decltype (x), Wildcard>>::
1848- template AppResultTuple<int32_t >,
1849- std::tuple<>>);
1854+ // static_assert(std::is_same_v<PatternTraits<App<decltype(x), Wildcard>>::
1855+ // template AppResultTuple<int32_t>,
1856+ // std::tuple<>>);
18501857 static_assert (
18511858 std::is_same_v<PatternTraits<App<decltype (x), Wildcard>>::
18521859 template AppResultTuple<std::array<int32_t , 3 >>,
18531860 std::tuple<std::array<int32_t , 3 >>>);
1854- static_assert (std::is_same_v<PatternTraits<And<App<decltype (x), Wildcard>>>::
1855- template AppResultTuple<int32_t >,
1856- std::tuple<>>);
1861+ // static_assert(std::is_same_v<PatternTraits<And<App<decltype(x), Wildcard>>>::
1862+ // template AppResultTuple<int32_t>,
1863+ // std::tuple<>>);
18571864
18581865 static_assert (PatternTraits<And<App<decltype (x), Wildcard>>>::nbIdV == 0 );
18591866 static_assert (PatternTraits<And<App<decltype (x), Id<int32_t >>>>::nbIdV == 1 );
@@ -2025,8 +2032,21 @@ namespace matchit
20252032 {
20262033 return dynamic_cast <T*>(std::addressof (b));
20272034 }
2035+
2036+ constexpr auto operator ()(T const & b) const
2037+ {
2038+ return std::addressof (b);
2039+ }
2040+
2041+ constexpr auto operator ()(T& b) const
2042+ {
2043+ return std::addressof (b);
2044+ }
20282045 };
20292046
2047+ static_assert (std::is_invocable_v<AsPointer<int >, int >);
2048+ static_assert (std::is_invocable_v<AsPointer<std::tuple<int >>, std::tuple<int >>);
2049+
20302050 template <typename T>
20312051 constexpr AsPointer<T> asPointer;
20322052
0 commit comments