Tôi đang cố hiểu khái niệm và lỗi. Chuyện gì thế này?std :: chức năng với các chức năng thành viên không tĩnh
class A
{
public:
A()
{
std::function<void(int)> testFunc(&A::func);
}
private:
void func(int) {}
}
câu hỏi của tôi, là nó có thể tạo ra bất kỳ loại của đối tượng đó có thể gọi là một thành viên của một trường hợp cụ thể mà std :: chức năng hoạt động như một con trỏ hàm thành viên, trừ trường hợp mà không cần định nghĩa kiểu lập dị mà có thể không được sử dụng như các tham số hàm trong các lớp kế thừa. ví dụ:
class A
{
public:
A()
{
index[WM_CREATE] = &A::close;
index[WM_DESTROY] = &A::destroy;
}
protected:
map<UINT msg, void (A::*)(HWND, UINT , WPARAM, LPARAM)> index;
void close(HWND,UINT, WPARAM, LPARAM);
void destroy(HWND, UINT, WPARAM, LPARAM);
};
class B : public A
{
public:
B()
{
index[WM_CREATE] = &B::create; // error because it's not a pointer of type A::*
}
private:
void create(HWND, UINT, WPARAM, LPARAM);
};
Tôi đang nghĩ đến tôi đi đúng hướng của việc sử dụng std :: chức năng như vậy:
class A
{
public: // Gigantic stl error with these two
A() // |
{ // V
index[WM_CREATE] = std::function<void(HWND, UINT, WPARAM, LPARAM>(&A::close);
index[WM_DESTROY] = std::function<void(HWND, UINT, WPARAM, LPARAM>(&A::destroy);
}
protected:
map<UINT msg, std::function<void(HWND, UINT, WPARAM, LPARAM)> > index;
void close(HWND,UINT, WPARAM, LPARAM);
void destroy(HWND, UINT, WPARAM, LPARAM);
};
class B : public A
{
public: // and this one
B() // |
{ // V
index[WM_CREATE] = std::function<void(HWND, UINT, WPARAM, LPARAM)>(&B::create);
}
private:
void create(HWND, UINT, WPARAM, LPARAM);
};
nếu ai đó có thể giải thích những gì các lỗi khó hiểu khổng lồ nghĩa và cách sửa chúng, tôi sẽ đánh giá cao nó.
Khi bạn nói "gọi thành viên của một trường hợp cụ thể trong đó' std :: function' hoạt động giống như con trỏ hàm thành viên ", điều đó có nghĩa là cá thể cụ thể được chỉ định tại thời điểm tạo hàm' std :: 'đối tượng? Đây là những gì chữ 'void (int)' gợi ý, nhưng sau đó đối tượng kết quả sẽ không hành động "giống như một con trỏ hàm thành viên", nó sẽ hoạt động như một callback/functor. Nếu mặt khác, bạn có nghĩa là đối tượng 'std :: function' kết quả thực sự hoạt động giống như một con trỏ hàm thành viên, thì chữ ký là sai (ví dụ: nó có thể là' void (A &, int) 'thay thế). Đó là nó? –
không chắc chắn những gì một callback/functor là, nhưng nó kinda âm thanh như chúng tôi đang phân biệt giữa một chức năng tĩnh và một chức năng không tĩnh, và tôi muốn nó là một chức năng không tĩnh. Họ đang xử lý để họ cần để có thể thao tác chỉ các thành viên trường hợp này. Như trong ví dụ, tôi muốn hàm đó được gọi khi chỉ mục bản đồ tương ứng được truyền vào. Đơn giản, tôi muốn làm điều này: index [WM_CREATE] (hwnd, msg, lparam, wparam); và cách duy nhất tôi có thể nghĩ để làm điều đó là lưu trữ con trỏ hàm hoặc một cái gì đó tương tự ở đó. Tôi không thể làm con trỏ thực tế mặc dù vì nó phá vỡ thừa kế: ( – FatalCatharsis
Bạn không thể sử dụng ['std :: mem_fun'] (http: //en.cppreference.com/w/cpp/utility/functional/mem_fn) thay thế? –