tôi đã viết các hàm mẫu sau đây, mà kiểm tra xem một container tùy ý chứa một yếu tố cụ thể:Enable mẫu chức năng nếu lớp có chức năng thành viên cụ thể
template<template<class, class...> class container_t, class item_t, class... rest_t>
bool contains(const container_t<item_t, rest_t...> &_container, const item_t &_item) {
for(const item_t &otherItem : _container) {
if(otherItem == _item) { return true; }
}
return false;
}
này hoạt động tốt cho hầu hết các container. Tuy nhiên đối với tất cả các loại bộ (và bản đồ), nó là phụ tối ưu vì chúng tôi có thể sử dụng:
template<template<class, class...> class set_t, class item_t, class... rest_t>
bool contains(const set_t<item_t, rest_t...> &_set, const item_t &_item) {
return _set.count(_item) > 0;
}
Rõ ràng là chúng tôi không thể sử dụng cả hai mẫu cùng một lúc do không rõ ràng. Bây giờ tôi đang tìm cách sử dụng std::enable_if
để bật mẫu đầu tiên nếu container_t
không cung cấp chức năng thành viên count
và mẫu thứ hai nếu có. Tuy nhiên tôi không thể tìm ra cách kiểm tra một hàm thành viên specif (sử dụng C++ 11).
Nếu bạn sẵn sàng tăng thêm dưới dạng phụ thuộc thì [boost.TTI] (http://www.boost.org/doc/libs/1_57_0/libs/tti/doc/html/index.html) có những gì bạn đang tìm kiếm trong macro 'BOOST_TTI_HAS_MEMBER_FUNCTION'' –
Bạn có chắc chắn muốn thực hiện điều này không? Trong thư viện chuẩn, chúng làm cho bạn hiểu chính xác biểu mẫu 'find' nào bạn muốn sử dụng để làm rõ ràng khi bạn đang thực hiện tìm kiếm tuyến tính và khi bạn đang sử dụng một cơ chế hiệu quả hơn. Một lưu ý phụ nếu bạn thực sự muốn làm điều này, chắc chắn sử dụng 'find' thay vì' count', nó chỉ tránh bi quan sớm. –
@SimonGibbons: Cảm ơn, nó trông giống như những gì tôi cần. Tuy nhiên tôi không muốn phụ thuộc vào việc tăng cường vào lúc này. – Haatschii