代码之家  ›  专栏  ›  技术社区  ›  Philipp

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

  •  5
  • Philipp  · 技术社区  · 15 年前

    我们定义了一些基于C++的编码风格指南 these guidelines . 第8条表示“代表模板类型的名字应该是一个大写字母”。解释:“C++开发社区中的共同实践。这使得模板名称相对于使用的所有其他名称都很突出。”

    template<class T> class vector {...} . 但是如果我有几个模板参数呢?我不这么认为 <class A, class B> <class AllocationPolicy, class ThreadingPolicy> .

    您是否同意,在某些情况下,通常不应应用给定的规则(根据1…,这是允许的)?

    6 回复  |  直到 15 年前
        1
  •  7
  •   David Rodríguez - dribeas    15 年前

    我不太同意那种命名惯例。对我来说,表示完全泛型类型的模板参数可以理解为一个简单的字母——这是一个类型 T ,我真的不在乎。但是,如果对类型有任何要求,那么可以生成一个名称来标识模板参数是什么: template <typename T, typename Allocator> struct container T型 可以,但第二个是分配器。

    a , b ... 在顺序或外观上,而是产生有意义的名称作为 文档 概念 提供该功能。

    课程:

    // 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 ,但在最后,您可以看到 通用的 它被称为 _总磷 , _Tp1

    它们之间有一条细线,例如 std::vector ,对泛型类型有实际要求: _总磷 必须是可分配的,但在一天结束时,它是 主要地 _Assignable 在某些容器中,如果有不止一个需求,那就很奇怪了。

        2
  •  4
  •   sharptooth    15 年前

    T ? 但是,我同意您的看法,在多个参数的情况下,它们应该具有有意义的名称,原因与变量通常应该具有有意义的名称相同。

        3
  •  1
  •   Diego Sevilla    15 年前

    当然,模板类型的表达性名称是有序的。当有一天,概念被引入到语言中时,它会更加有用(遗憾的是,它们被丢弃为C++ 0x)。同时,模板参数类型的名称至少非正式地描述了对给定类型的期望(概念会给它们一个形式,列出类型必须具有的预期类型和操作)。

        4
  •  1
  •   BЈовић    15 年前

    不同的编码标准将定义不同的命名。就挑一个,坚持住。

    我的首选项是具有描述性的名称,而不是一些泛型类型名称T(尽管在某些情况下它并不坏)。

        5
  •  1
  •   Jeremy Friesner    15 年前

        6
  •  1
  •   Community Mohan Dere    9 年前

    如果只是一种类型,我倾向于使用单字母标识符(T、U等)。如果参数有一个特殊的更有限的含义(谓词、分配器等),我会使用更具描述性的东西。

    但是,单字母标识符(T)可以通过与宏名称冲突来回击(请参见 GCC 4.2 Template strange error ),这可能不太可能使用较长的标识符(如果它们不使用与宏相同的ALL-CAPS约定)。