是否有一个好的/广泛采用的c ++模板编码约定/标准?

时间:2011-02-22 04:34:55

标签: c++ templates coding-style

我喜欢编码标准。在编写C ++时,我喜欢编码标准。一个好的编码标准为语言添加了上下文,使得难以解析更容易。

我认为每个人至少都熟悉一些常用的标准:

  • 以“m”或“m _”
  • 为前缀的成员变量
  • 类前缀(通常是项目特定的,即在Qt中所有类名称都以'Q'为前缀)
  • 包括保护惯例,例如“将文件名全部置括号,替换'。'用'_'“
  • 三个规则

有很多像这样的小C ++规则。不幸的是,我从未设法找到与模板相关的指南。我认为模板参数最流行的名称是'T',但它没有意义,除非模板很明显,否则它会使代码更难以阅读。

无论如何,我遇到的核心问题是模板难以阅读,我认为可以使用一些约定来使它们更容易阅读。有没有人知道一个广泛应用的约定,使模板化的代码更容易阅读?

6 个答案:

答案 0 :(得分:7)

加入我的盐。我认为C ++编程世界中最重要的两个库是标准模板库和Boost库。我个人试图大多符合这些库中占主导地位的符号。也就是说,模板参数的类,函数,数据成员,typedef,枚举等的下划线小写名称和CamelCase(无下划线分隔)。通常,您还希望模板参数具有合理的名称。一个好的做法是给它们应该实现的概念的名称(例如,应该是实现ForwardIteratorConcept的迭代器的模板参数应该命名为ForwardIterator)。

您提到的约定(成员的“m”和类的大写字母起始名称)是一种纯粹的面向对象编程约定(“纯粹”的含义如下:没有任何其他编程范例,如通用编程或模板元编程)。它主要用于Java(或者是编程C ++的Java“natives”)。我个人不喜欢它,知道很少有人这样做。在使用这种表示法的框架或项目中工作时,我总是有些恼火,它使用标准库,增强库以及名称空间的整体正确使用进行了解释。

答案 1 :(得分:3)

我的建议是始终查看语言的标准库,以获取设置编码约定的示例。结果是您的代码将更自然地读取它所用语言。基本上,编写看起来像它的C ++可能是ISO C ++文档的一部分。

对于C ++,标准容器,迭代器和算法有许多模板可供您使用。

作为一个反例,使用camel case会使你的C ++代码像Java一样读取。当你最终使用标准库中的东西和你自己的代码一起使用时,它看起来会很奇怪。

尽管如此,有两个例外需要考虑。首先,如果你已经拥有一个庞大的代码库,请按照已有的代码库:混合风格令人困惑。其次,有很好的库,比如Qt,不遵循标准库的风格,它们也值得作为编码标准的例子。

答案 2 :(得分:2)

*成员变量前缀为'm'或'm _'

可疑。

*类前缀(通常是项目特定的,即在Qt中所有类名都以'Q'为前缀)

可怕。当天是必要的练习。

三巨头也不是真正的标准,并且几乎被Big Two取代为一个好习惯(因为使用RAII作为指针否定了析构函数的必要性,即使你需要复制ctr和赋值)。

无论如何......

您需要将模板参数与普通代码区分开来。因此,您应该使用标准代码中未使用的命名约定来获取模板参数。许多人使用的一个好方法是使用CamelCase作为模板参数。另一个重要的方面是,因为C ++根本不强制执行概念,所以在他们期望的概念之后命名参数。因此,ForwardIter为参数创建了一个好的参数名,而不是前向迭代器。

当然,如果您已经将CamelCase用于您的类名(Java程序员 - blech:p),那么您应该使用其他东西。

当您进入复杂的实例化时,您需要使用一些方法在多行中声明模板实例化。元编程时,您还经常需要将事物分成多行和/或多个类型/模板。这是你学习的东西之一。我喜欢以下方法:

template < typename MyParams >
struct my_metafunction
  : mpl::if_
    <
      check // probably wouldn't actually split this one since it's trivial...but as example...
      <
        MyParams
      >
    , some_type_expression
    , some_other_type_expression
    >
{};

答案 3 :(得分:2)

名称没有“共同惯例”。即使你提到的惯例也没有你想象的那么普遍。除了Windows开发人员的子集之外,我无法想到任何使用mm_前缀的类成员数据的人。类似地为类名添加前缀。

此类约定特定于项目。你在项目中同意他们并继续前进。当你开始一个新项目时,如果你愿意的话,拥有新的约定是完全正确的。如果你没有想象力或信心去挑选自己的约定,那就去购买Herb Sutter和Andrei Alexandrescu的C++ Coding Standards书。实际上,您应该真正阅读它,因为它处理的命令远比命名约定更有效。事情真的很重要。

如果它有帮助我有时会看到人们选择以大写字母开头的模板参数短名称。例如,template<class Ch, class Tr>。查看编译器的标准库以获取灵感。

答案 4 :(得分:0)

如果您想查看他们的编码惯例,请查看Boost

答案 5 :(得分:0)

与其他人说的一样,这取决于项目的编码风格。我喜欢在编码时使用以低于分数分隔的小写字母。为了和谐,我也使用小写字母作为模板参数。为了区别于其他人,我从下划线开始,以“_t”结尾。

`

template<typename _encoder_t>
class compression
{
typedef typename _encoder_t::settings settings_t;
...
};

`