Skip to content

Commit

Permalink
Fix #107. Add support for C++17 noexcept.
Browse files Browse the repository at this point in the history
With C++17 'noexcept' becomes part of a function's signature (if
present).
Therefore, template-specializations which try to match a function
signature must also consider the 'noexcept' keyword now.

This is fixed now.
  • Loading branch information
DenizThatMenace committed May 29, 2017
1 parent b2a705d commit f774ab5
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 0 deletions.
18 changes: 18 additions & 0 deletions include/boost/sml.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,24 @@ template <class R, class T, class... TArgs>
struct function_traits<R (T::*)(TArgs...) const> {
using args = type_list<TArgs...>;
};
#if __cplusplus > 201402L
template <class R, class... TArgs>
struct function_traits<R (*)(TArgs...) noexcept> {
using args = type_list<TArgs...>;
};
template <class R, class... TArgs>
struct function_traits<R(TArgs...) noexcept> {
using args = type_list<TArgs...>;
};
template <class R, class T, class... TArgs>
struct function_traits<R (T::*)(TArgs...) noexcept> {
using args = type_list<TArgs...>;
};
template <class R, class T, class... TArgs>
struct function_traits<R (T::*)(TArgs...) const noexcept> {
using args = type_list<TArgs...>;
};
#endif
template <class T>
using function_traits_t = typename function_traits<T>::args;
}
Expand Down
18 changes: 18 additions & 0 deletions include/boost/sml/aux_/type_traits.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,24 @@ template <class R, class T, class... TArgs>
struct function_traits<R (T::*)(TArgs...) const> {
using args = type_list<TArgs...>;
};
#if __cplusplus > 201402L
template <class R, class... TArgs>
struct function_traits<R (*)(TArgs...) noexcept> {
using args = type_list<TArgs...>;
};
template <class R, class... TArgs>
struct function_traits<R(TArgs...) noexcept> {
using args = type_list<TArgs...>;
};
template <class R, class T, class... TArgs>
struct function_traits<R (T::*)(TArgs...) noexcept> {
using args = type_list<TArgs...>;
};
template <class R, class T, class... TArgs>
struct function_traits<R (T::*)(TArgs...) const noexcept> {
using args = type_list<TArgs...>;
};
#endif
template <class T>
using function_traits_t = typename function_traits<T>::args;

Expand Down

0 comments on commit f774ab5

Please sign in to comment.