C ++类型是从地址中抽象出来的吗? - C ++模板

时间:2012-10-14 22:56:30

标签: c++ templates types metaprogramming c++-address

不幸的是,我已经失去了本文的链接和来源,但我确实记得它是关于C ++中的元编程和模板;在谈到模板方法的局限性时,本文讨论的事实是传递给模板的内容不是泛型类型,而只是具有相关地址的类型(或者可寻址,我不记得确切的单词)可以作为参数传递给模板。

有人可以澄清地址,类型和模板之间的这种关系吗?

可以使用地址标识类型吗?


修改

例如at this link,在链接常见问题解答的最后一部分中,模板系统被描述为采用地址而不是泛型类型的东西。

2 个答案:

答案 0 :(得分:3)

我不知道您阅读的原始文章,但您在编辑中链接到的常见问题解答谈论类型和地址之间的连接。

它讨论了一种特定类型的模板参数,非类型参数。模板参数有三种:类型非类型模板。所以这是第二种。

以下定义中的非类型参数示例为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 *的参数。

大多数常用模板可以使用整数,枚举或用户定义类型的类型参数或非类型参数。这些都与内存地址无关。使用模板和使用内存地址之间没有隐式连接。

答案 1 :(得分:1)

以下是使用地址标识的类型示例:

int foo;

template <int *IP>
class Bar {
};

Bar<&foo> baz;

但不知何故,我认为这不是文章的意思。

类型本身在C ++中没有地址。类型中的个别定义可能有也可能没有自己的地址。有些东西只在该类型的实例中有地址。

我在那里使用的技巧只能用于程序整个生命周期中存在的对象。然后对象的地址成为类型名称的一部分。

模板甚至不是C ++中的类型。它们只是在使用一组特定参数进行实例化时才是一种类型。他们也没有地址。