Vietnamese Developers’ Blog

Từ khóa typename trong C++

Posted in C/C++ by kiennguyen on October 31, 2007

So với các từ khóa phổ biến của C++ mà chúng ta hay gặp thì typename là một từ khóa mới, ra đời cùng với sự ra đời của khái niệm template. Mục đích của typename là để thông báo rằng tên (identifier) được viết ngay sau từ khóa là một tên kiểu (type). Cụ thể, typename được sử dụng trong hai trường hợp sau đây

1 – Từ khóa typename có thể được sử dụng thay cho từ khóa class trong các định nghĩa template:

Ví dụ, thay vì viết:

template < class T >
class MyClass {...}; 

Chúng ta có thể viết

template < typename T >
class MyClass {...}; 

Hai từ khóa typename và class được sử dụng đồng thời trong trường hợp này là do vấn đề lịch sử. Khi mới bắt tay vào viết đặc tả cho các template, ngài Stroustrup đã quyết định tái sử dụng từ khóa class thay vì giới thiệu một từ khóa mới. Một số người thích sử dụng typename hơn vì nó có vẻ mang tính đại diện hơn so với class (kiểu T không chỉ là class mà còn có thể là các kiểu dữ liệu cơ bản nữa). Trái lại, một số người thích dùng class hơn vì sẽ tốn ít thời gian gõ phím hơn -D (để gõ từ typename chúng ta phải di chuyển ngón tay khắp bàn phím!). Một số khác thì thích sử dụng class hơn bởi họ muốn để dành typename cho trường hợp hai dưới đây.

2 – Từ khóa typename được sử dụng để thông báo rằng tên theo sau từ khóa là một tên kiểu.

template < class T >
class MyClass
{
    typename T::SubType * ptr;
    ...
};

Trong ví dụ này, typename được dùng để thông báo rằng SubType là một kiểu của lớp T. Bởi vậy, ptr sẽ là một con trỏ có kiểu T::SubType*. Nếu không có mặt từ khóa typename, trình dịch có thể sẽ hiểu SubType là một biến tĩnh (static member) của lớp T. Khi đó dòng khai báo T::SubType* ptr sẽ được diễn giải thành tích của hai giá trị T::SubType và ptr, với ptr là một biến đã được khai báo ở “đâu đó”.

Bởi T::SubType được hiểu là một tên kiểu nên tất cả các kiểu muốn đóng vai trò tham số kiểu cho lớp MyClass đều phải định nghĩa một kiểu bên trong (inner type) tên là SubType. Ví dụ:

Dòng khai báo sau đây

MyClass< Q > x; 

chỉ hợp lệ khi Q có một định nghĩa kiểu bên trong như sau

class Q
{
    typedef int SubType;
    ...
};

Trong trường hợp này, thành phần ptr của biến x sẽ là một con trỏ kiểu int*. SubType cũng có thể là một kiểu dữ liệu trừu tượng như sau

class Q
{
    class SubType;
    ...
};

Từ khóa typename luôn phải có mặt để thông báo rằng một tên trong một định nghĩa template là một tên kiểu, kể cả khi việc hiểu tên đó như một tên biến sẽ dẫn đến kết quả vô nghĩa. Quy tắc của C++ là tất cả các tên trong một định nghĩa template đều được hiểu là các tên biến, trừ khi tên đó được đi trước bởi từ khóa typename.

Một số site viết về từ khóa typename:

http://pages.cs.wisc.edu/~driscoll/typename.html

http://www.cs.indiana.edu/~welu/notes/node36.html

http://blogs.msdn.com/slippman/archive/2004/08/11/212768.aspx

Tagged with:

Leave a Reply