Соглашения об именах для типов шаблонов? - PullRequest
22 голосов
/ 28 марта 2009

Традиционно имена типов шаблонов представляют собой одну заглавную букву:

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 ]

32 голосов
/ 28 марта 2009

Для шаблонов C ++ у меня есть пара шаблонов

Если есть только один параметр шаблона, я называю его T (или U, V для вложенных шаблонов).

Когда есть несколько параметров и использование не сразу очевидно, я использую описательные имена с префиксом T. Например, TKey, TValue, TIdentifiier и т. Д. ... Это позволяет довольно легко определить параметры при использовании шаблона.

Я бы не стал использовать заглавные буквы. Большинство людей используют все идентификаторы верхнего регистра в C / C ++ для представления определения макроса. Повторение этого шаблона для параметра шаблона может сбить людей с толку в будущем.

8 голосов
/ 28 марта 2009

Я использую соглашение 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;
4 голосов
/ 28 марта 2009

Обычно традиционный способ - использовать T, если есть только один тип param. Если есть больше, используйте T в качестве префикса, например, Тат. Префикс «T» помогает мгновенно увидеть его параметр типа. Использование TAtom для параметра одного типа также допустимо.

1 голос
/ 28 марта 2009

В нашем магазине используется нотация 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 );
}

Префикс описывает тип, в то время как имя должно говорить о роли, которую аргумент играет в контексте определенной функции.

1 голос
/ 28 марта 2009

Я пытаюсь следовать понятию, которое использует мой поставщик компиляторов: оно не слишком короткое и не слишком многословное. И помогает мне читать сообщения об ошибках, которые я получаю со стандартными шаблонами. (Это еще одна причина, по которой я перешел с const T& на T const&). Что-то вроде:

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

где мой компилятор обычно использует:

template <class _Ty, class _Container>
class std_algo { ...
1 голос
/ 28 марта 2009

Вы не должны использовать специальное соглашение об именах для шаблонов, просто используйте то же соглашение, что и для любого другого этого типа (как для классов или переменных). В коде не должно иметь значения, работаете ли вы с типами / значениями шаблонов или с обычными.

0 голосов
/ 28 марта 2009

Я придерживаюсь тех же общих правил именования параметров шаблона имен, что и для именования классов и структур, то есть с заглавной буквы первой буквы или каждого слова, например:

class MyGizmo
{
};

struct Thingy
{
};

class TPSReport 
{
};


template<class ValType> ...

template<typename Number> ...
0 голосов
/ 28 марта 2009

Если у меня есть класс с одним параметром типа, я использую имя T. Также это означает, что все операции в этом классе работают с T.

Если у меня мало параметров, я называю это как в вашем объяснении AtomT, BioT ...
Если параметр шаблона не является типом объекта, с которым мы работаем в классе, например стратегия, comaparator или функтор, я использую имя без T например. ThreadStrategy, сравни.

Иногда, чтобы избежать смешивания стилей, я делаю typedef в классе:
typedef T value_type;

-
Соглашение об усилении имен (http://www.boost.org/development/requirements.html#Naming_consistency) говорит о следующих параметрах шаблона:
Имена параметров шаблона начинаются с заглавной буквы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...