2010-06-16 5 views
21

Tôi biết nó có thể tách rời để tạo ra một con trỏ tới hàm thành viên như thế nàycon trỏ tới hàm thành viên const typedef

struct K { void func() {} }; 
typedef void FuncType(); 
typedef FuncType K::* MemFuncType; 
MemFuncType pF = &K::func; 

Có cách tương tự để xây dựng một con trỏ tới một hàm const? Tôi đã thử thêm const ở những nơi khác nhau mà không thành công. Tôi đã chơi xung quanh với gcc số và nếu bạn làm mẫu trích trên một cái gì đó giống như

template <typename Sig, typename Klass> 
void deduce(Sig Klass::*); 

Nó sẽ hiển thị Sig với như một chữ ký chức năng với const chỉ tacked ở cuối dòng. Nếu để làm điều này trong mã nó sẽ khiếu nại rằng bạn không thể có vòng loại trên một loại chức năng. Có vẻ như nó sẽ có thể bằng cách nào đó bởi vì việc khấu trừ hoạt động.

Trả lời

32

Bạn muốn điều này:

typedef void (K::*MemFuncType)() const; 

Nếu bạn muốn vẫn căn MemFuncType trên FuncType, bạn cần thay đổi FuncType:

typedef void FuncType() const; 
typedef FuncType K::* MemFuncType; 
+0

Có bạn là đúng nó hoạt động! Tôi nghĩ rằng tôi đã thử thứ hai này, nhưng đoán không, đó là một máy tính mặc dù có thể trình biên dịch cũ. Sẽ phải kiểm tra lại vào ngày mai. – oldcig

6

Một sự tinh tế nhẹ cho thấy làm thế nào để làm điều đó mà không có một typedef. Trong một bối cảnh suy luận như sau, bạn không thể sử dụng typedef.

template <typename Class, typename Field> 
Field extract_field(const Class& obj, Field (Class::*getter)() const) 
{ 
    return (obj.*getter)(); 
} 

áp dụng cho một số lớp học với một getter const:

class Foo { 
public: 
    int get_int() const; 
}; 

Foo obj; 
int sz = extract_field(obj, &Foo::get_int);