tôi sử dụng phương pháp nổi tiếng sau đây dựa trên SFINAE:
#define TYPE_SUPPORTS(ClassName, Expr) \
template<typename U> \
struct ClassName \
{ \
private: \
template<typename> \
static constexpr std::false_type test(...); \
\
template<typename T = U> \
static decltype((Expr), std::true_type{}) test(int) ; \
\
public: \
static constexpr bool value = decltype(test<U>(0))::value; \
};
Mục đích chính của macro là đơn giản hóa việc thêm kiểm tra loại. Macro xác định một lớp cho phép bạn thực hiện kiểm tra tùy ý cho một loại T
.
Như một ví dụ, để kiểm tra xem std::begin()
có thể được gọi cho một loại:
namespace detail
{
TYPE_SUPPORTS(SupportsBegin, std::begin(std::declval<T>()))
}
template<typename T>
bool supportsBegin()
{
return detail::SupportsBegin<T>::value;
}
Tất nhiên, detail
namespace và chức năng bao bọc đều đường cú pháp, nhưng cải thiện cú pháp một chút về phía người gọi .
Nguồn
2016-07-27 15:23:19
Có mục đích nào cho câu hỏi hoặc bạn chỉ tò mò – aaronman