Соглашения об именах для типов шаблонов?
Традиционно имена типов шаблонов - это всего лишь одна буква верхнего регистра:
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 {};
Это заставляет их выделяться (а также снова буквы верхнего регистра). Что вы думаете?
Ответы
Ответ 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> ...