2012-03-13 44 views
5
const char* s1 = "teststirg"; 
const char s2[] = "teststirg"; 

Tôi muốn một phương pháp cho tôi biết rằng s1 là "char *" và s2 là "char []", cách viết phương thức?Làm thế nào để xác định loại const char * và const char [] trong mã?

+1

Bạn có muốn một hàm có tính năng char * nhưng có thể cho bạn biết cách nó được khai báo ban đầu không? Tôi không nghĩ rằng có một cách di động để làm điều đó. –

+0

Yeap, không có một cách di động để có được loại ban đầu.Chỉ cần một mẹo nhỏ để có được loại trực quan. – zsounder

Trả lời

6

Sử dụng các mẫu:

template<typename T, unsigned int SIZE> 
bool IsArray (T (&a)[SIZE]) { return true; } 

template<typename T> 
bool IsArray (T *p) { return false; } 

này sẽ đánh giá tại thời gian chạy.
Cách sử dụng:

if(IsArray(s1)) 
... 

if(IsArray(s2)) 
... 

Nếu quan tâm, bạn có thể sử dụng một số kỹ thuật trước, mà sẽ cho bạn biết thời gian như biên dịch này.

Sửa:

typedef char (&yes)[2]; 

template<typename T, unsigned int SIZE> 
yes IsArray (T (&a)[SIZE]); 

template<typename T> 
char IsArray (T *p); 

Cách sử dụng:

if(sizeof(IsArray(s1)) == sizeof(yes)) 
... 
if(sizeof(IsArray(s2)) == sizeof(yes)) 
... 
+1

Không phải là nó rất có khả năng phiên bản đầu tiên sẽ được inlined và const-propagated để biên dịch-thời gian vs thời gian chạy kết thúc lên là như nhau không? Trong nhị phân đã xuất ra. – KillianDS

+0

@KillianDS, Đối với trường hợp cụ thể này, bạn đã đúng. Nhưng phiên bản thứ nhất không thể được sử dụng như là một phần của các đối số 'template' vì nó không tạo ra hằng số biên dịch. Có thể với C++ 11 'constexpr', chúng ta có thể sử dụng phiên bản 1 cũng như hằng số thời gian biên dịch. – iammilind

+1

@KillianDS: có, tuy nhiên trừ khi được đánh dấu 'constexpr' phiên bản đầu tiên không thể được sử dụng cho lập trình mẫu meta. –

0

Nếu bạn có quyền truy cập vào các định nghĩa ban đầu, sau đó typeid thể được sử dụng (nhưng để làm gì, tôi không biết). Nếu bạn không có quyền truy cập vào định nghĩa gốc ... Không có cách nào để biết liệu một char* đã được khởi tạo từ một char* hoặc từ một mảng hay chưa.

0

Trong bối cảnh trên (có nghĩa là trong cùng một phương pháp mà chúng tôi có khai báo),

/*1*/ s1[0]='\0'; 
    /*2*/ s2=s1; 
    /*3 Only This is valid*/ s1=s2; 
    /*4*/ s2[0]='\0'; 

trình biên dịch của bạn sẽ không cho phép bước 1,2,4 để vượt qua, trong khi bước 3 sẽ thành công. Điều này cho thấy rõ ràng bản chất của các biến. Bây giờ, liên quan đến phương thức (gọi hàm) để xác định điều đó, bạn sẽ phải có định nghĩa trong chữ ký phương thức anyways, vì vậy tôi không thấy bất kỳ mục đích/tiện ích/khả năng nào của phương thức này.

determiner (const char* s1,const char *const s2) 

Bạn đã có định nghĩa trong chữ ký.Bạn cần bỏ qua trình biên dịch để sử dụng. Tôi xin lỗi, Nếu tôi không có yêu cầu của bạn đúng.

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