К сожалению, я потерял ссылку и источник этой статьи, но я помню, что речь шла о метапрограммировании и шаблонах в C ++; когда речь шла об ограничениях, связанных с шаблонным подходом, в этой статье говорилось о том, что то, что передается шаблону, не является универсальным типом, а только типами со связанным адресом (или адресуемым, я не помню точных слов) могут быть переданы в качестве аргументов в шаблон.
Может кто-нибудь прояснить эту связь между адресами, типами и шаблонами?
Тип можно идентифицировать по адресу?
РЕДАКТИРОВАТЬ
например по этой ссылке, в последней части связанного FAQ система шаблонов описывается как нечто, принимающее адрес, а не универсальный тип.
Я не знаю об оригинальной статье, которую вы прочитали, но часто задаваемые вопросы, на которые вы ссылались в редактировании, не говорить о связи между типами и адресами.
Он говорит об одном конкретном виде параметров шаблона, нетиповые параметры. Существует три вида параметров шаблона: тип, не типа а также шаблон. Так что это конкретно о втором виде.
Примером нетипичного параметра является Id
в определении ниже:
template <const char *Id>
struct C
{};
Id
не представляет тип, но не является типом, то есть фактическим значением. В этом конкретном примере это значение имеет тип указателя, и оно представляет адрес строки.
Идея состоит в том, что вы можете использовать это для создания экземпляра шаблона, используя строку в качестве различающего:
C<"foo"> c1; // Instantiating the "foo" version of type C
C<"bar"> c2; // Instantiating the "bar" version of type C
К сожалению, это не работает так, и именно об этом и есть статья FAQ. Это объясняет, что для нетипичного параметра шаблона вы должны использовать константное выражение, и в этом конкретном случае вы должны использовать идентификатор объекта с внешней связью, а не просто литерал. Таким образом, единственный способ сделать это — это:
template <const char *Id>
struct C
{
};
char id1[] = "foo";
char id2[] = "bar";
int main()
{
C<id1> c1;
C<id2> c2;
/*...*/
return 0;
}
Вот что объясняет статья FAQ.
Однако, опять же, это очень особый случай, потому что это относится к нетиповые параметры только для типа адреса. Обратите внимание, что подключение к адреса указывается потому, что не типовой параметр явно указан как параметр типа указателя const char *
,
В большинстве обычных шаблонов возможно использование либо параметра типа, либо параметра нетипового типа целого, перечисления или определенного пользователем типа. Ни один из них не имеет ничего общего с адресами памяти. Не существует явной связи между использованием шаблонов и использованием адресов памяти.
Вот пример типа, идентифицируемого с адресом:
int foo;
template <int *IP>
class Bar {
};
Bar<&foo> baz;
Но почему-то я не думаю, что это означало статью.
Сами типы не имеют адресов в C ++. Отдельные определения внутри типа могут иметь или не иметь свои собственные адреса. И некоторые вещи имеют адреса только в экземпляре типа.
Уловка, которую я использовал там, может быть использована только для объектов, которые существуют в течение всего времени жизни программы. И тогда адрес объекта становится частью имени типа.
И шаблоны даже не являются типами в C ++. Они являются только типом, когда они были созданы с определенным набором параметров. И у них тоже нет адресов.