我们正在定义一些基于these guidelines的C ++编码风格指南。数字8表示“代表模板类型的名称应该是一个大写的字母。”说明:“C ++开发社区的常见做法。这使得模板名称相对于所有其他名称都很突出。”
真的那么常见吗?我同意拥有template<class T> class vector {...}
很有意义。但是,如果我有几个模板参数怎么办?我认为<class A, class B>
比<class AllocationPolicy, class ThreadingPolicy>
更容易理解。
您是否同意通常情况下不应用给定规则(根据1 ...允许)?
谢谢你的想法!
答案 0 :(得分:7)
我不同意这个命名惯例。对我来说,表示完全通用类型的模板参数作为一个简单的字母有意义 - 这是一个类型T
,我真的不关心哪个。但是如果对类型有任何要求,那么生成一个标识模板参数的名称是有意义的:template <typename T, typename Allocator> struct container
- 第一种类型是通用的,任何T
都适合,但第二种类型一个是分配器。
函数没有什么不同,你不希望你的参数被调用a
,b
......按顺序或外观,而是作为文档。另外,如果开发样式指南,我会考虑在模板类的情况下要求模板参数的本地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约定)作为宏)。