我想實現我自己的is_member_function_pointer
,我遇到了麻煩。is_member_function_pointer implementation
namespace __implementation
{
// integral_constant
template<typename T, T v>
struct integral_constant
{
static constexpr T result = v;
typedef integral_constant<T,v> type;
constexpr operator T() { return result; }
};
// true_type
typedef integral_constant<bool, true> true_type;
// false_type
typedef integral_constant<bool, false> false_type;
// remove_const
template<typename T> struct remove_const { typedef T type; };
template<typename T> struct remove_const<const T> { typedef T type; };
// remove_volatile
template<typename T> struct remove_volatile { typedef T type; };
template<typename T> struct remove_volatile<volatile T> { typedef T type; };
// remove_cv
template<typename T> struct remove_cv
{ typedef typename remove_volatile<typename remove_const<T>::type>::type type; };
// is_function - ugliness ahead due to variadic functions!
template<typename T, typename... Args> struct is_function : public false_type {};
template<typename T, typename... Args> struct is_function<T(Args...)> : public true_type {}; // normal function
template<typename T, typename... Args> struct is_function<T(Args......)> : public true_type {}; // variadic function
// is_member_function_pointer
template<typename T> struct is_member_function_pointer : public false_type {};
template<typename T, typename Class> struct is_member_function_pointer<T Class::*> : public is_function<T> {};
}
/*
* Short forms: either alias templates or constexpr functions
*/
// remove_const
template<typename T>
using remove_const = typename __implementation::remove_const<T>::type;
// remove_volatile
template<typename T>
using remove_volatile = typename __implementation::remove_volatile<T>::type;
// remove_cv
template<typename T>
using remove_cv = typename __implementation::remove_cv<T>::type;
// is_member_function_pointer
template<typename T>
constexpr bool is_member_function_pointer { return __implementation::is_member_function_pointer<T>::result; }
// is_function
template<typename T>
constexpr bool is_function() { return __implementation::is_function<typename __implementation::remove_cv<T>::type>::result; }
問題在於正常的函數指針,它無法像爲member_function_pointer模板一樣工作。此外,const成員函數指針不被識別爲member_function_pointer,這是不幸的。我該如何解決這個問題?我相信我可以enable_if
一個正常的函數指針專門化,以解決正常的函數指針問題,但我看不到一個出來的const成員函數指針問題的一種方式(我已經字面上嘗試添加類型trait中的remove_cv和const的無處不在定義,無濟於事)。我可以看到當前is_member_function_pointer沒有處理const類的成員函數,但我不知道我可以使用什麼語法。
任何幫助表示讚賞。
'__implementation'肯定是一個保留的標識符(兩個下劃線)。 – UncleBens
@UncleBens哦,是的,但我完全繞過標準庫,所以我並不在乎。如果它爆炸在我的臉上,我會解決它。 – rubenvb