Tôi đã sử dụng std::mem_fn
và std::bind
đối với tài sản phản ánh phong cách.
Vì vậy, tôi sẽ có một class SomeClass
có vectơ là AbstractProperty
. Có thể có các loại khác nhau của các tầng lớp từ AbstractProperty
, chẳng hạn như PropertyFloat
, PropertyU32
vv
Sau đó, trong SomeClass
tôi sẽ bind
đến một std::function
cho AbstractProperty
. Tôi sẽ bind
bằng cách làm
std::bind(std::mem_fn(&SomeClass::SomeFloatGetter), this)
Đối với một hàm kiểu setter, tôi sẽ sử dụng
std::bind(std::mem_fn(&SomeClass::SomeSetterGetter), this, std::placeholders::_1)
Tất nhiên, để thiết lập các chức năng đến lớp là khó khăn hơn, nhưng tôi sử dụng một std::function
làm vì thế. Trong PropertyFloat
Tôi có
typedef std::function<float(void)> GetterType;
Vì vậy, nó thiết lập nó qua một chức năng, tôi sẽ vượt qua std::bind
đầu tiên tôi đã giới thiệu như là tham số cho
typename PropertyFloat::GetterType getter
Tất nhiên, các loại có thể tận dụng các mẫu và được chung chung hơn, nhưng đó là một thương mại tùy thuộc vào những gì bạn đang phát triển.
+1. Đó là loại điều tôi muốn thử quá. Bạn có thêm chi tiết để chia sẻ về cách bạn đã thực hiện bit phản chiếu? – Fanatic23
Hmm, đây là cơ bản nhất mà tôi có thể mô tả mà không cần phải đặt toàn bộ codebase lên github hoặc thứ gì đó (và mã nguồn là mã nguồn đóng). Tôi đã cập nhật bài đăng của mình để cung cấp thêm chi tiết. Thật không may, không có nhiều tài liệu cho loại hệ thống mà tôi đã phát triển ở đây. Tôi đang trong quá trình viết một tài liệu lớn trên toàn bộ hệ thống, nhưng nó vẫn chưa hoàn thành. Tôi có thể nói rằng tôi đã sử dụng 'std :: mem_fn' và' std :: bind' cho loại điều này trong gần hai năm mặc dù không có vấn đề gì. – josephthomas
Ngoài ra không, đây là một trong những cách sử dụng phức tạp nhất của 'mem_fn' và' bind' mà tôi biết. Nếu bạn đang tìm cách để có được thực hành bằng cách sử dụng hai loại, có lẽ bạn nên xem xét một số tập quán nhỏ của chúng (tôi đã làm lúc đầu tiên trước khi tôi phát triển hệ thống này). Hệ thống phản xạ này được xây dựng xung quanh việc sử dụng hai loại này (và 'std :: function'). Mặc dù thành thật, điều này có thể được thay thế bằng con trỏ hàm thành viên (theo lý thuyết). Cả hai đều có lợi thế và bất lợi của họ. – josephthomas