模板类型的命名约定?

时间:2009-03-28 13:17:24

标签: c++ templates naming-conventions

传统上,模板类型的名称只是一个大写字母:

template<class A, class B, class C>
class Foo {}; 

但我犹豫不决,因为它不具描述性,因此难以阅读。所以,这样的事情不会更好:

template<class AtomT, class BioT, class ChemT>
class Foo {}; 

我也倾向于认为以下不是一个坏主意:

template<class ATOM, class BIO, class CHEM>
class Foo {}; 

它使它们脱颖而出(而且,它又是大写字母)。你有什么看法?

8 个答案:

答案 0 :(得分:32)

对于C ++模板,我有几种模式

如果只有一个模板参数,我将其命名为T(或嵌套模板的U,V)。

如果有多个参数并且使用不是很明显,那么我使用前缀为T的描述性名称。例如,TKey,TValue,TIdentifiier等...这使得参数在整个模板使用中都很容易被发现。

我会避免全部大写版本。大多数人使用C / C ++中的所有大写标识符来表示宏定义。重复模板参数的模式可能会使人们感到困惑。

答案 1 :(得分:8)

我使用约定TName作为模板参数,使用NameT作为存储模板参数。

template <typename TFirst, typename TSecond>
class Templated
{
    typedef TFirst FirstT;
    typedef TSecond SecondT;
}

typedef Templated<int, std::string> MyTemplated;
...
const MyTemplated::FirstT size;

答案 2 :(得分:4)

通常,传统方法是在只有一个类型参数的情况下使用T.如果还有更多,请使用T作为前缀,例如TAtom。 “T”前缀有助于即时查看其类型参数。将TAtom用于单个类型参数也是有效的。

答案 3 :(得分:1)

您不应该对模板使用特殊的命名约定,只需使用与该类型的任何其他约定相同的约定(对于类或变量)。在代码中,无论您使用的是模板类型/值还是正常模板都无关紧要。

答案 4 :(得分:1)

我尝试遵循我的编译器供应商使用的概念:它不是太短而且不太冗长。并帮助我阅读标准模板中的错误消息。 (这是我从const T&切换到T const&的另一个原因。类似的东西:

template <class Ty, class Container>
class my_algo { ...

我的编译器通常会使用:

template <class _Ty, class _Container>
class std_algo { ...

答案 5 :(得分:1)

在我们的商店,我们使用HungF ## ngarian表示法。模板参数只是与所有其他参数一样的参数,除了它们不是const,也不是变量,而是类型。

template< typename at_Container, typename at_Functor > 
at_Functor& foreach( const at_Container& ac_Cont, at_Functor& av_Func ) {
    return std::foreach( ac_Cont.begin(), ac_Cont.end(), av_Func );
}

前缀描述了类型,而名称则表示参数在定义函数的上下文中扮演的角色。

答案 6 :(得分:0)

如果我有一个带有一个类型参数的类,我使用名称T.这也意味着这个类中的所有操作都在使用T.

如果我在你的解释AtomT,BioT ......中有很少的参数命名 如果模板参数不是我们在clas中工作的对象的类型,例如策略,comaparator或仿函数,我使用没有T的名称,例如ThreadStrategy,比较。

有时为了避免混合风格我在课堂上制作typedef:
typedef T value_type;

-
提升命名约定(http://www.boost.org/development/requirements.html#Naming_consistency)接下来说明模板参数:
模板参数名称以大写字母开头。

答案 7 :(得分:0)

我遵循相同的一般约定命名模板参数类型名称,因为我遵循命名类&amp;结构,用于大写第一个字母或每个单词,如下所示:

class MyGizmo
{
};

struct Thingy
{
};

class TPSReport 
{
};


template<class ValType> ...

template<typename Number> ...