2010-11-14 46 views
11

Tôi muốn viết con trỏ trong C++ (hoặc trong C++ 0x), điều đó sẽ trỏ đến toán tử của một lớp cho phép nói A hoặc B. Có phương pháp nào để làm điều đó không?C++ con trỏ tới toán tử

Tất nhiên có một cú pháp như

int (A::*_p)(); 

nhưng nó không giải quyết được vấn đề này. Tôi muốn tạo con trỏ chung, không chỉ định lớp cơ sở cho nó - chỉ con trỏ cho "hàm vận hành"

#include <thread> 
#include <iostream> 

using namespace std; 

class A 
{ 
public: 
    int operator()() 
    { 
     return 10; 
    } 
}; 

class B 
{ 
public: 
    int operator()() 
    { 
     return 11; 
    } 
}; 

int main() 
{ 
A a; 
int (*_p)(); 
_p = a.operator(); 
cout << _p(); 

B b; 
_p = b.operator(); 
cout << _p(); 
} 

Trả lời

22

Không, bạn không thể làm điều này. Loại lớp là một phần của loại hàm thành viên của toán tử.

Loại A::operator()() khác với loại B::operator()(). Loại cũ là loại int (A::*)() trong khi loại sau thuộc loại int (B::*)(). Những loại đó hoàn toàn không liên quan. Gần nhất bạn có thể nhận được là bằng cách sử dụng một cái gì đó giống như C++ 0x đa chức năng wrapper function (được tìm thấy trong C++ 0x, C++ TR1, và Boost) và bằng cách sử dụng bind để ràng buộc con trỏ hàm thành viên vào một lớp ví dụ:

std::function<int()> _p; 

A a; 
_p = std::bind(&A::operator(), a); 
std::cout << _p(); 

B b; 
_p = std::bind(&B::operator(), b); 
std::cout << _p(); 
+0

Hơn bạn rất nhiều! đó là chính xác những gì tôi đang tìm kiếm! :) –

Các vấn đề liên quan