我们正在根据 these guidelines 定义一些 C++ 编码风格指南.数字 8 表示“代表模板类型的名称应该是单个大写字母。”解释:“C++ 开发社区的常见做法。这使得模板名称相对于所有其他使用的名称而言更加突出。”
真的有那么普遍吗?我同意拥有 template<class T> class vector {...}
很有意义.但是,如果我有多个模板参数怎么办?我不认为 <class A, class B>
比 <class AllocationPolicy, class ThreadingPolicy>
更容易理解.
您是否同意经常存在不应应用给定规则的情况(根据 1... 是允许的)?
谢谢你的想法!
最佳答案
我不太同意那个命名约定。对我来说,表示完全通用类型的模板参数就像一个简单的字母一样有意义——这是一个类型 T
,我真的不在乎哪个。但是如果对类型有任何要求,生成一个名称来标识模板参数是什么是有意义的:template <typename T, typename Allocator> struct container
-- 第一种类型是通用的,任何 T
将适合,但第二个是分配器。
这与函数没有什么不同,您不希望调用参数 a
, b
...按顺序或外观,而是产生有意义的名称作为文档的一部分。此外,如果开发样式指南,我会考虑在模板类的情况下要求模板参数的本地 typedef 以及对类型要求的静态断言(只要可能)。也就是说,至少在概念提供该功能之前。
我认为 STL 是一个很好的库示例,您可以看到生成 typedef 有助于阅读代码(来自 g++ 4.2 STL):
类:
// from <vector> -> <bits/stl_vector.h>
template<typename _Tp, typename _Alloc = std::allocator<_Tp> >
class vector : protected _Vector_base<_Tp, _Alloc>
{
// Concept requirements.
typedef typename _Alloc::value_type _Alloc_value_type; // _Alloc contains value_type internal type
__glibcxx_class_requires(_Tp, _SGIAssignableConcept) // _Tp is assignable
[...]
public:
typedef _Tp value_type; // from here on _Tp is not mentioned
typedef typename _Tp_alloc_type::reference reference; // check + typedef
[...]
iterator begin() {
// without typedef:
// __gnu_cxx::__normal_iterator<pointer, vector_type> begin() {
[...]
reference operator[](size_type __n)
// _Tp& operator[](size_type __n)
[...]
// from <memory>
template <typename _Tp>
class auto_ptr
{
[...]
template <typename _Tp1>
auto_ptr(auto_ptr<_Tp1>& __a) throw()
和函数:
template <typename _InputIterator, typename _Tp>
inline _InputIterator find( _InputIterator __first, _InputIterator __last, _Tp value ) {
// concept requirements
__glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
[...]
他们所有的名字都以_
为前缀和大写字母或第二个 _
,这是为实现保留的名称,他们更喜欢 _Tp
在 _T
, 但最后你可以看到,只要类型是 generic ,它就被称为 _Tp
, _Tp1
...,而当它有一些特定的要求时,选择一个更明智的名称。
它们之间有一条细线,例如 std::vector
,对泛型有实际要求:_Tp
必须是可赋值的,但归根结底,它是一个主要通用类型。调用它 _Assignable
在有多个要求的某些容器中会很奇怪。
关于c++ - 代表模板类型的名称应该是单个字符吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4152578/