2014-07-08 15 views
10

Giả sử tôi có định nghĩa sau đây:Làm thế nào để rõ ràng đề cập đến hoạt động với mẫu quá tải

int f(int) { return 1; } // a) 

template<typename T> int f(T x) { return 2; } // b) 

Tôi hiểu rằng nếu tôi gọi f, ví dụ f(1), không quá tải mẫu a) sẽ được ưu tiên, nhưng có cách nào để tham khảo rõ ràng a) không? Ví dụ, tôi có thể sử dụng f<int> để tham khảo b) một cách rõ ràng.

Như một ví dụ về lý do tại sao điều này sẽ có ích, hãy xem xét các chức năng sau:

template<typename Func, typename T> void print_result(Func f, T arg) 
{ 
    std::cout << f(arg) << std::endl; 
} 

Nếu tôi cố gắng sử dụng nó trên f, ví dụ: print_result(f,1), tôi nhận được một lỗi biên dịch (trình biên dịch không biết trong đó có nghĩa là f). Tôi có thể sử dụng print_result(f<int>,1) để yêu cầu sử dụng b), nhưng làm cách nào để tôi sử dụng a)?

Tôi thấy tôi có thể sử dụng print_result(static_cast<int (*)(int)>(f), 1), nhưng điều này cảm thấy bị hack và rườm rà. Có cách nào tốt hơn?

+5

* "Tôi tìm thấy tôi có thể sử dụng' print_result (static_cast (f), 1) '" * Đó thực sự là cách thông thường để chọn một chức năng của một tập quá tải. Bạn cũng có thể sử dụng '[] (int p) {return f (p); } 'hoặc trong C++ 1y,' [] (auto && p) -> decltype (tự động) {return f (std :: forward (p)); } ' – dyp

+1

Thay vì' static_cast', bạn cũng có thể sử dụng chuyển đổi ngầm: 'print_result (f, 1);' – dyp

+0

@dyp Tôi đã thử nghiệm nó trong VS2013, sử dụng C++ 11 tiêu chuẩn, phải không? – herohuyongtao

Trả lời

1

sử dụng mẫu chuyên môn:

template<> 
int f<int>(int x) { return 1; } // a) 
+0

cảm ơn bạn đã trả lời nhưng nó không thực sự trả lời câu hỏi của tôi. Nếu tôi không có quyền tự do xác định lại các chức năng thì sao? Tôi luôn luôn có thể xác định một hàm wrapper (hoặc lambda như dyp gợi ý trong các ý kiến ​​của mình cho câu hỏi) nhưng tôi đã hy vọng sẽ có một cách neater. – toth

+2

Trong khi điều này giải quyết được vấn đề, thông thường người ta không muốn chuyên về các mẫu chức năng (xem http://www.gotw.ca/publications/mill17.htm) –

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