2013-07-18 28 views
5

Tôi có mẫu sau:quá tải cấp mẫu web Chức năng cho Tất cả các loại Chuỗi

template<class T> 
void fn(T t){ } 

và tôi muốn thay đổi hành vi của mình cho bất cứ điều gì có thể được chuyển đổi sang std::string.

Cả hai chỉ định chuyên môn mẫu rõ ràng và quá tải hàm không có mẫu với tham số là std::string chỉ hoạt động cho các cuộc gọi được chuyển vào std::string chứ không phải các chức năng khác vì nó có vẻ phù hợp với mẫu trước khi thử đối số chuyển đổi.

Có cách nào để đạt được hành vi mà tôi muốn không?

Trả lời

9

Cái gì đó như trường hợp này giúp bạn trong C++ 11

#include <type_traits> 
#include <string> 
#include <iostream> 

template<class T> 
typename std::enable_if<!std::is_convertible<T, std::string>::value, void>::type 
fn(T t) 
{ 
    std::cout << "base" << std::endl; 
} 

template<class T> 
typename std::enable_if<std::is_convertible<T, std::string>::value, void>::type 
fn(T t) 
{ 
    std::cout << "string" << std::endl; 
} 

int main() 
{ 
    fn("hello"); 
    fn(std::string("new")); 
    fn(1); 
} 

live example

Và dĩ nhiên, bạn có thể nhận ra nó bằng tay, nếu bạn không có C++ 11, hoặc sử dụng tăng.

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