[英]Case of names for template typename
给定一个C ++模板类(或函数)定义:
template<typename T>
struct Foo {
T member;
};
-如果在更复杂的情况下,我想使类型名称更具表现力,则接受或避开哪种情况下的命名约定(以及原因)。 例子:
template<typename MORE_EXPRESSIVE_NAME>
struct More {
MORE_EXPRESSIVE_NAME* p_;
More(MORE_EXPRESSIVE_NAME* p);
...
};
template<typename MORE_EXPRESSIVE_NAME>
More<MORE_EXPRESSIVE_NAME>::More(MORE_EXPRESSIVE_NAME* p)
: p_(p)
{ }
要么
template<typename MoreExpressiveName>
struct More {
MoreExpressiveName* p_;
More(MoreExpressiveName* p);
...
};
template<typename MoreExpressiveName>
More<MORE_EXPRESSIVE_NAME>::More(MoreExpressiveName* p)
: p_(p)
{ }
要么
template<typename mr_exprs_nm>
struct More {
mr_exprs_nm* p_;
More(mr_exprs_nm* p);
...
};
template<typename mr_exprs_nm>
More<mr_exprs_nm>::More(mr_exprs_nm* p)
: p_(p)
{ }
命名约定的主要内容是一致性。 无论采用哪种约定,请在整个项目中保持一致,因此,如果您跳入已经采用一种约定的项目,请坚持使用(如果没有,请重命名)。
话虽这么说,在我所见的大多数命名约定中,所有大写字母通常都保留给宏使用,因此我绝对会避免使用。
我本人更喜欢为模板参数命名,例如为类型或常量命名(取决于参数的种类),以保持一致性。 在这种情况下,假设您使用“ More
我也将使用驼峰式大小写。
至于键入内容,则取决于:
FwdIt
for ForwardIterator
,以提醒类型应实现的类型 MORE_EXPRESSIVE_NAME看起来像预编译器常量。 mr_exprs_nm并不比Foo好多少。 我投票支持MoreExpressiveName。 有多种命名约定,但是在这种情况下,简单的常识有助于找到最佳的解决方案。
正如Matthieu M.所说,在命名约定时,一致性比约定本身更为重要。
就是说,这是我使用的约定:
CamelCase
用于结构,类,typedef和模板参数名称。 基本上,任何看起来像类型名称的东西都是CamelCase。
template<typename MoreExpressiveName> ...
我还将CamelCase
用于static const
全局变量
static const int MyMagicNumber = 42;
underscore_lcase
表示变量和参数的名称。 成员变量还获得了trailing_underscrore_
。
template<typename MoreExpressiveName>
More<MoreExpressiveName>::More(MoreExpressiveName* my_thing)
{
my_thing_ = my_thing;
}
宏的ALL_CAPS
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.