c++ - 代表模板类型的名称应该是单个字符吗?

标签 c++ templates coding-style

我们正在根据 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/

相关文章:

c++ - 使用 gcc 编译的静态库中未解析的符号

c++ - 如何使用 PatchELF 或 chrpath 替换库共享对象

c++ - 为什么编译器不针对同一翻译单元中的 ODR 违规发出警告

c++ - 添加数组类型自动扣除

c++ - 输入缓冲和屏蔽密码输入 C++

c++ - 这个 C++ 代码片段如何将任意类型转换为唯一整数?

coding-style - 编写转换函数的最佳方式

java - 为清楚起见命名集合扩展

javascript - 何时使用 which - 多个方法、多个参数或一个选项参数

c++ - 带有 std::thread 和 std::chrono 的基本计时器