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

时间:2010-11-11 08:34:34

标签: c++ templates coding-style

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

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

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

谢谢你的想法!

6 个答案:

答案 0 :(得分:7)

我不同意这个命名惯例。对我来说,表示完全通用类型的模板参数作为一个简单的字母有意义 - 这是一个类型T,我真的不关心哪个。但是如果对类型有任何要求,那么生成一个标识模板参数的名称是有意义的:template <typename T, typename Allocator> struct container - 第一种类型是通用的,任何T都适合,但第二种类型一个是分配器。

函数没有什么不同,你不希望你的参数被调用ab ......按顺序或外观,而是作为文档。另外,如果开发样式指南,我会考虑在模板类的情况下要求模板参数的本地typedef以及对类型的要求的静态断言(尽可能)。也就是说,至少在 concepts 提供该功能之前。

我认为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而不是{{1}但是最后你可以看到,只要一个类型泛型,它就被称为_T_Tp ...,而当它附加了一些特定的要求时,选择了一个更明智的名字。

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

答案 1 :(得分:4)

我想这取决于你有多少参数。如果参数是一个类型而且它是唯一的参数,为什么它不能只是T?但是我同意你的看法,在多个参数的情况下,它们应该具有有意义的名称,原因与变量通常应该具有有意义的名称的原因相同。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

各种编码标准将定义不同的命名。只需选一个,然后坚持下去。

我的偏好是具有描述性名称,而不是一些通用类型名称T(尽管在某些情况下它并不坏)。

答案 4 :(得分:1)

我认为单字母名称(在模板和其他方面)的主要问题是您想要进行搜索和替换。如果您的文本编辑器不包含C ++解析器(并且大多数不包含),则单字母名称将导致许多您不想要的虚假匹配。使用更长/描述性的名称OTOH,搜索和替换更有可能按预期工作。

答案 5 :(得分:1)

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

但是,单字母标识符(T)可以通过与宏名称(请参阅GCC 4.2 Template strange error)冲突来反击,这可能更不可能使用更长的标识符(如果它们不使用相同的ALL_CAPS约定)作为宏)。