Tôi muốn có một lớp thực hiện operator()
một số cách khác nhau dựa trên một tùy chọn được đặt trong lớp. Bởi vì điều này sẽ được gọi là một số lượng lớn thời gian, tôi không muốn sử dụng bất cứ điều gì mà chi nhánh. Lý tưởng nhất là, operator()
sẽ là một con trỏ hàm có thể được thiết lập bằng một phương thức. Tuy nhiên, tôi không chắc điều này thực sự trông như thế nào. Tôi đã thử:Toán tử làm con trỏ hàm
#include <iostream>
class Test {
public:
int (*operator())();
int DoIt1() {
return 1;
}
int DoIt2() {
return 2;
}
void SetIt(int i) {
if(i == 1) {
operator() = &Test::DoIt1;
} else {
operator() = &Test::DoIt2;
}
}
};
int main()
{
Test t1;
t1.SetIt(1);
std::cout << t1() << std::endl;
t1.SetIt(2);
std::cout << t1() << std::endl;
return 0;
}
Tôi biết nó sẽ hoạt động nếu tôi tạo một con trỏ hàm khác và gọi hàm từ hàm operator()
. Nhưng liệu có thể có hàm operator()
chính nó là một con trỏ hàm? Một cái gì đó dọc theo dòng của những gì tôi đăng (mà không biên dịch)?
Đoạn mã trên cho:
test.cxx:5:21: error: declaration of ‘operator()’ as non-function
test.cxx: In member function ‘void Test::SetIt(int)’:
test.cxx:17:16: error: ‘operator()’ not defined
test.cxx:19:16: error: ‘operator()’ not defined
test.cxx: In function ‘int main()’:
test.cxx:30:19: error: no match for call to ‘(Test)()’
test.cxx:34:19: error: no match for call to ‘(Test)()’
'int (operator())(); '... đúng cú pháp? – iammilind
Hrm, nó phải là 'int (* operator())();' Tôi nghĩ, nhưng điều đó chỉ làm tăng toàn bộ các lỗi khác. Tôi sẽ chỉnh sửa mã. – tpg2114
"Tôi không muốn sử dụng bất cứ thứ gì mà nhánh. Lý tưởng nhất, toán tử() sẽ là một con trỏ hàm" - Trên thực tế, các nhánh sẽ tốt hơn cho hiệu năng. CPU hiện đại có tỷ lệ thành công cao hơn 50% trong việc dự đoán nhánh nào sẽ được thực hiện; các con trỏ hàm có thể trỏ đến bất kỳ đâu và do đó khó hơn trên logic dự đoán. – MSalters