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?
* "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
Thay vì' static_cast', bạn cũng có thể sử dụng chuyển đổi ngầm: 'print_result (f, 1);' –
dyp
@dyp Tôi đã thử nghiệm nó trong VS2013, sử dụng C++ 11 tiêu chuẩn, phải không? – herohuyongtao