Ngắn câu chuyện, có cách nào đơn giản/được định nghĩa để xử lý các đối tượng hàm/lambdas và các hàm thành viên theo cách được sắp xếp hợp lý không?Sử dụng lệnh std :: function/mem_fn trong C++ 11 với các hàm thành viên
Nếu tôi hiểu đúng, nếu tôi sử dụng std :: mem_fn, tôi cần phải vượt qua một đối tượng của loại chính xác cho cuộc gọi chức năng, tức là
Object o;
ftncall std::mem_fun(&Object::function);
ftncall(o);
Lý tưởng nhất, sẽ có một số cách để 'đính kèm 'o
đối với đối tượng chức năng đó, có thể là std::weak_ptr
, vì vậy chúng tôi biết nếu o đã bị xóa. Ví dụ: nếu có cách để làm điều gì đó mơ hồ như thế này:
Object o;
ftncall std::mem_fn(&Object::function, o); // Or maybe std::mem_fn<Object>
ftncall();
Bây giờ, rõ ràng, điều này không tồn tại (theo kiến thức của tôi). Có cách nào để bọc std :: mem_fn theo cách như vậy mà tôi không mất tính tổng quát (và độc đáo) của std :: mem_fn, nhưng có thể 'đính kèm' o
, VÀ vẫn chơi độc đáo với các loại chức năng khác, như std :: function? Lý tưởng nhất, tôi vẫn có thể sử dụng operator()
theo cách mà tôi làm với std :: function.
Hiện nay các giải pháp tốt nhất mà tôi có thể nghĩ đến là một lớp trông như thế này:
template<class T>
class MemFunWrapper {
public:
MemFunWrapper(T* t, std::mem_fun funct) : m_t(t), m_function(funct) {}
std::mem_fun operator*() { return m_function; }
T* get() { return m_t; }
private:
T* m_t;
std::mem_fun m_function;
}
Sau đó, bạn có thể sử dụng nó thusly:
(*MemFunWrapper)(MemFunWrapper->get(), args...);
Nhưng điều đó có vẻ khá khó sử dụng đối với tôi. Ngoài ra, tôi sẽ phải tạo ra một lớp tương đương cho std :: chức năng cho rằng có thể sử dụng theo cách tương tự, và điều đó có vẻ ngớ ngẩn vì tôi đã có thể chỉ sử dụng std :: function. Lý tưởng nhất, tôi cũng có thể sử dụng sản phẩm cuối cùng mà không biết liệu tôi có đang gọi chức năng thành viên hay chức năng thông thường hay không. Tôi biết tôi đang hỏi rất nhiều - mọi hướng sẽ hữu ích. Cảm ơn nhiều!
Tại sao cảm ơn bạn - bạn có thể vừa hoàn thành tất cả hy vọng và ước mơ của mình! –
Không nên là dòng 'auto fn = std :: bind (& Object :: member, o);' được 'tự động fn = std :: bind (& Object :: member, &o);', nhớ đối số thứ hai là 'std: : bind' –
Phụ thuộc vào ý định của bạn Cả hai đều hữu ích trong các hoàn cảnh khác nhau – goji