Tôi biết rằng có nhiều cách có thể để phát hiện nếu một lớp có hàm cụ thể nhưng không thực sự hoạt động cho trường hợp chính xác của tôi. Việc triển khai hiện tại của tôi để kiểm tra chức năng thành viên chính xác có hoạt động không, ngoại trừ các hàm kế thừa.Loại đặc điểm: Kiểm tra xem lớp có hàm cụ thể (có thể kế thừa)
#include <type_traits>
template<typename T>
class HasFoo {
template <typename U, int (U::*)(float)>
struct Check;
template <typename U>
static std::true_type Test(Check<U, &U::foo> *);
template <typename U>
static std::false_type Test(...);
public:
static constexpr bool value = decltype(Test<T>(0))::value;
};
struct A {
int foo(float);
};
struct B : public A {
};
struct C {
unsigned int foo(double);
};
struct D {
static int foo(float);
};
static_assert(HasFoo<A>::value, "A should have foo.");
static_assert(HasFoo<B>::value, "B should inherit foo from A.");
static_assert(!HasFoo<C>::value, "C should not have foo.");
static_assert(!HasFoo<D>::value, "Ds static foo should be false.");
thực hiện này không làm việc cho static_assert của B.
Một workaround inacceptable sẽ được kiểm tra:
template <typename U, int (U::A::*)(float)>
struct Check; |
|- add base class
Nhưng đó tôi sẽ phải biết lớp cơ sở và điều này nên tránh.
Có ai có ý tưởng về cách kiểm tra các chức năng phái sinh không?
Chỉnh sửa: Đặc điểm kiểu cũng sẽ hoạt động nếu không tồn tại Foo.
struct E {};
static_assert(!HasFoo<E>::value, "E does not have foo.");
Cảm ơn bạn đã trả lời. Tôi quên đề cập đến: Nếu lớp học không có foo ở tất cả, nó phải biên dịch. Chỉnh sửa câu hỏi của tôi. – Viatorus
@Viatorus Tôi đã cập nhật câu trả lời của tôi - Đây không phải là sạch hơn như phiên bản đầu tiên nhưng điều này có thể được cải thiện. – Holt