Подтвердить что ты не робот

Соглашения об именах для типов шаблонов?

Традиционно имена типов шаблонов - это всего лишь одна буква верхнего регистра:

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 {}; 

Это заставляет их выделяться (а также снова буквы верхнего регистра). Что вы думаете?

4b9b3361

Ответ 1

Для шаблонов С++ у меня есть несколько шаблонов

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

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

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

Ответ 2

Я использую условное 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;

Ответ 3

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

Ответ 4

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

Ответ 5

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

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

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

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

Ответ 6

В нашем магазине мы используем нотацию HungF ## ngarian. Аргументы шаблона - это просто аргументы, подобные всем остальным, за исключением того, что они не являются константой, а не переменной, но имеют тип.

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 );
}

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

Ответ 7

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

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

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

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

Ответ 8

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

class MyGizmo
{
};

struct Thingy
{
};

class TPSReport 
{
};


template<class ValType> ...

template<typename Number> ...