O wiele łatwiej jest sprawdzić, czy funkcja członkowska może zostać wywołana na const
- kwalifikowanej l-wartości.
template<class T>
using const_lvalue_callable_foo_t = decltype(std::declval<const T&>().foo());
template<class T>
using has_const_lvalue_callable_foo = std::experimental::is_detected<const_lvalue_callable_foo_t, T>;
spłukać i powtórzyć, z wyjątkiem std::declval<const T>()
, aby sprawdzić, czy wspomniana funkcja może być wywołana na const
-qualified rvalue. Nie mogę wymyślić żadnych dobrych przypadków użycia dla funkcji składowych const &&
, więc wątpliwe jest, czy istnieje możliwość wykrycia tego przypadku.
Skonsultuj się z bieżącym Library Fundamentals 2 TS working draft, jak wdrożyć is_detected
.
Jest dużo bardziej zawiłe, by sprawdzić, czy dany wskaźnik do funkcji członków punkty typ do typu funkcji ze szczególnym cv-kwalifikatora nast. To wymaga 6 częściowych specjalizacji na cv-qualifier-seq (const
i const volatile
są różne cv-qualifier-seq s) i nadal nie może obsłużyć przeciążonych funkcji składowych lub szablonów funkcji członka. Szkicując pomysł:
template<class T>
struct is_pointer_to_const_member_function : std::false_type {};
template<class R, class T, class... Args>
struct is_pointer_to_const_member_function<R (T::*)(Args...) const> : std::true_type {};
template<class R, class T, class... Args>
struct is_pointer_to_const_member_function<R (T::*)(Args...) const &> : std::true_type {};
template<class R, class T, class... Args>
struct is_pointer_to_const_member_function<R (T::*)(Args...) const &&> : std::true_type {};
template<class R, class T, class... Args>
struct is_pointer_to_const_member_function<R (T::*)(Args..., ...) const> : std::true_type {};
template<class R, class T, class... Args>
struct is_pointer_to_const_member_function<R (T::*)(Args..., ...) const &> : std::true_type {};
template<class R, class T, class... Args>
struct is_pointer_to_const_member_function<R (T::*)(Args..., ...) const &&> : std::true_type {};
Jeśli chcesz const volatile
być true
też zlikwidować kolejne 6 częściowych specjalizacji wzdłuż tych linii.
na adres ostatnią część nie, to dlatego, że pierwsza jest wskaźnik funkcji stałej zwracający pustkę, a drugi wskaźnik funkcji zwracający unieważnienie. –
Spekuluję także, że is_const przechwytuje typ zwracany, a nie kwalifikator const na samej funkcji. Nie mogę jednak poprawnie odpowiedzieć na to pytanie, ponieważ nie jestem pewien, jak sprawić, by zachowywał się tak, jak tego chcesz. –
@William Dzięki za pomoc. Tak, nie wiem, jak sprawdzić to zakwalifikowanie const =/ –