表示模板类型的名称应该是单个字符吗?

Phi*_*ipp 5 c++ templates coding-style

我们根据这些指南定义了一些C++编码风格指南.数字8表示"代表模板类型的名称应该是一个大写的字母." 说明:"C++开发社区的常见做法.这使得模板名称相对于所有其他名称都很突出."

这真的很常见吗?我同意这很有道理template<class T> class vector {...}.但是,如果我有几个模板参数怎么办?我不认为这<class A, class B>比理解更容易<class AllocationPolicy, class ThreadingPolicy>.

您是否同意通常情况下不应用给定的规则(根据1 ...允许)?

谢谢你的想法!

Dav*_*eas 7

我不同意这个命名惯例.对我来说,表示完全通用类型的模板参数作为一个简单的字母有意义 - 这是一种类型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() 
Run Code Online (Sandbox Code Playgroud)

功能:

template <typename _InputIterator, typename _Tp>
inline _InputIterator find( _InputIterator __first, _InputIterator __last, _Tp value ) {
  // concept requirements
  __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
  [...]
Run Code Online (Sandbox Code Playgroud)

所有的名字都是由前缀_以及一个大写字母或第二_,这是实施保留的名称,并且他们也喜欢_Tp_T,但最后你可以看到,每当一类是通用的叫法_Tp,_Tp1... ,当它附加一些特定要求时,选择一个更明智的名称.

它们之间有一条细线,例如std::vector,对泛型类型有实际要求:_Tp必须是可分配的,但在一天结束时,它是一种大多数类型._Assignable在一些需要多个容器的容器中调用它会很奇怪.