2009-03-28 39 views
21

Theo truyền thống, tên của các kiểu mẫu chỉ là một lá thư chữ hoa duy nhất:Quy ước đặt tên cho các loại mẫu?

template<class A, class B, class C> 
class Foo {}; 

Nhưng tôi ngần ngại để làm điều này vì nó không mô tả và cứng do đó để đọc. Vì vậy, sẽ không một cái gì đó như thế này là tốt hơn:

template<class AtomT, class BioT, class ChemT> 
class Foo {}; 

Tôi cũng có xu hướng nghĩ rằng sau đây sẽ không phải là một ý tưởng tồi:

template<class ATOM, class BIO, class CHEM> 
class Foo {}; 

Nó làm cho họ nổi bật (và cũng có thể, đó là thượng chữ cái một lần nữa). Ý kiến ​​của bạn là gì?

Trả lời

28

Đối với C++ templates Tôi có một vài mẫu

Nếu có chỉ là một tham số mẫu duy nhất, tôi đặt tên cho nó T (hoặc U, V cho các mẫu lồng nhau).

Khi có nhiều tham số và việc sử dụng không hiển thị ngay lập tức thì tôi sử dụng tên mô tả được đặt trước bằng T. Ví dụ: TKey, TValue, TIdentifiier, v.v ... Điều này làm cho các tham số trở nên dễ dàng trong suốt quá trình sử dụng mẫu .

Tôi sẽ tránh tất cả phiên bản chữ hoa. Hầu hết mọi người sử dụng tất cả các định danh chữ hoa trong C/C++ để biểu diễn một định nghĩa macro. Lặp lại mẫu đó cho một tham số mẫu có khả năng gây nhầm lẫn cho mọi người xuống đường.

+1

... và cũng có thể gây nhầm lẫn trình biên dịch. Hãy thử #include mẫu lớp Foo {}; –

+0

Tôi không sử dụng T làm tiền tố vì nó là tiền tố giống nhau được sử dụng bởi một số sản phẩm từ "Borland" và đối với tôi, nó hơi khó hiểu. – Ismael

+0

Tiền tố T cũng cho phép bạn sử dụng tên * unprefixed * làm tên phương thức chung (hoặc bất kỳ biểu tượng nào khác trong không gian tên). Ví dụ, một tham số 'const TValue & Value() const {return value _;}' –

4

Nói chung, cách truyền thống là sử dụng T nếu chỉ có một loại tham số. Nếu có nhiều hơn, hãy sử dụng T làm tiền tố, ví dụ: TAtom. Tiền tố "T" giúp ngay lập tức thấy thông số loại của nó. Sử dụng TAtom cho một tham số kiểu đơn cũng hợp lệ.

0

Nếu tôi có lớp học với một tham số kiểu tôi đang sử dụng tên T. Ngoài ra nó có nghĩa là tất cả operartion trong lớp này đang làm việc với T.

Nếu tôi có vài thông số tôi đặt tên như trong AtomT explamle của bạn , BioT ...
Nếu thông số mẫu không phải là loại đối tượng mà chúng tôi đang làm việc trong clas ví dụ chiến lược, comaparator hoặc functor, tôi đang sử dụng tên mà không có T ví dụ ThreadStrategy, So sánh.

Đôi khi để tránh các kiểu trộn, tôi đang tạo typedef trong lớp:
typedef T value_type;

-
Boost quy ước đặt tên (http://www.boost.org/development/requirements.html#Naming_consistency) nói về mẫu thông số tiếp theo:
tên tham số Template bắt đầu với một ký tự hoa.

1

Bạn không nên sử dụng quy ước đặt tên đặc biệt cho mẫu, chỉ cần sử dụng cùng quy ước như đối với bất kỳ quy ước nào khác của loại đó (như đối với các lớp hoặc biến). Nó không nên quan trọng trong mã cho dù bạn đang làm việc với các kiểu mẫu/giá trị hoặc các giá trị bình thường.

+0

Đúng cho tên của các kiểu tham số, Foo , nhưng câu hỏi là về tên tham số kiểu, T trong mẫu Foo . Vì vậy, nó không phải là một loại, nó là một tên tham số. –

+0

Lưu ý rằng các tham số kiểu chỉ có thể truy cập bởi chính mẫu đó, để làm cho chúng có sẵn cho người dùng mẫu của bạn, bạn phải gõ chúng (ví dụ: 'template ... {typedef FooT Foo;};', vì vậy nếu bạn chỉ cần sử dụng quy ước tiêu chuẩn, tên có thể xung đột –

+0

Ý kiến ​​của bạn đã thay đổi từ '09? Mọi người sử dụng 'mName' hoặc' m_name' cho thành viên, 'szName' theo kiểu Hungary, v.v. - nếu có các quy ước cho các trường hợp và đối số hỗ trợ chúng, tôi không thấy lý do tại sao những đối số đó sẽ không mở rộng đến các mẫu. Nếu một kiểu hoặc kiểu cá thể khác về cơ bản, tôi nói bạn nên sử dụng các quy ước cho cả hai hoặc không (Meta-convention for metaprogramming!) –

1

Tôi cố gắng tuân theo khái niệm mà nhà cung cấp trình biên dịch của tôi sử dụng: nó không quá ngắn và không quá dài dòng. Và giúp tôi đọc các thông báo lỗi tôi nhận được với các mẫu chuẩn. (Đó là một lý do khác khiến tôi chuyển từ const T& sang T const&).Một cái gì đó như:

template <class Ty, class Container> 
class my_algo { ... 

nơi trình biên dịch của tôi thường sẽ sử dụng:

template <class _Ty, class _Container> 
class std_algo { ... 
+4

Tôi nghĩ rằng bạn đã biết điều này, nhưng đối với bất cứ ai khác đọc này, lưu ý rằng ông không sử dụng một gạch dưới hàng đầu. Đó là RESERVED cho trình biên dịch. Đó là, các mẫu thư viện chuẩn được phép sử dụng _Ty. Người dùng thì không. Ty là hợp pháp, vì nó không bắt đầu bằng dấu gạch dưới. – jalf

+0

@jalf: +1. Tuyệt vời bắt :) Tôi đã được đồng bằng lười biếng để liên lạc khi này ít được biết đến nhưng 'có thể đến-trở lại-và-cắn-bạn-sau' điểm. – dirkgently

+0

Quod licet Iovi, không biếu bovi. – Frank

8

tôi sử dụng ước tname cho mẫu tham số và NameT cho tham số mẫu được lưu trữ.

template <typename TFirst, typename TSecond> 
class Templated 
{ 
    typedef TFirst FirstT; 
    typedef TSecond SecondT; 
} 

typedef Templated<int, std::string> MyTemplated; 
... 
const MyTemplated::FirstT size; 
+1

Haha, thật vui. – Frank

+0

Mykola, quan điểm là gì ... –

+0

Điểm lưu trữ các loại templated là gì? Họ khác nhau. Tôi chỉ cho thấy cách tôi đặt tên cho các loại được lưu trữ đó. Loại quy ước của riêng tôi. –

0

Tôi làm theo những quy ước chung giống nhau đặt tên typenames mẫu tham số như tôi làm theo cách đặt tên lớp & cấu trúc, mà là để tận dụng các chữ cái đầu tiên hoặc mỗi từ, như vậy:

class MyGizmo 
{ 
}; 

struct Thingy 
{ 
}; 

class TPSReport 
{ 
}; 


template<class ValType> ... 

template<typename Number> ... 
1

Tại cửa hàng của chúng tôi , chúng tôi sử dụng ký hiệu HungF ## ngarian. Đối số mẫu chỉ là các đối số như tất cả các đối số khác, ngoại trừ chúng không phải là một const, cũng không phải là một biến, mà là một kiểu.

template< typename at_Container, typename at_Functor > 
at_Functor& foreach(const at_Container& ac_Cont, at_Functor& av_Func) { 
    return std::foreach(ac_Cont.begin(), ac_Cont.end(), av_Func); 
} 

Tiền tố mô tả loại, trong khi tên có nghĩa là để nói điều gì đó trong vai trò đối số phát trong ngữ cảnh của hàm được xác định.