Типы C ++ являются абстракцией от адресов? — шаблоны C ++

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

Может кто-нибудь прояснить эту связь между адресами, типами и шаблонами?

Тип можно идентифицировать по адресу?


РЕДАКТИРОВАТЬ

например по этой ссылке, в последней части связанного FAQ система шаблонов описывается как нечто, принимающее адрес, а не универсальный тип.

0

Решение

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

Он говорит об одном конкретном виде параметров шаблона, нетиповые параметры. Существует три вида параметров шаблона: тип, не типа а также шаблон. Так что это конкретно о втором виде.

Примером нетипичного параметра является 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 *,

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

3

Другие решения

Вот пример типа, идентифицируемого с адресом:

int foo;

template <int *IP>
class Bar {
};

Bar<&foo> baz;

Но почему-то я не думаю, что это означало статью.

Сами типы не имеют адресов в C ++. Отдельные определения внутри типа могут иметь или не иметь свои собственные адреса. И некоторые вещи имеют адреса только в экземпляре типа.

Уловка, которую я использовал там, может быть использована только для объектов, которые существуют в течение всего времени жизни программы. И тогда адрес объекта становится частью имени типа.

И шаблоны даже не являются типами в C ++. Они являются только типом, когда они были созданы с определенным набором параметров. И у них тоже нет адресов.

1

По вопросам рекламы [email protected]