不幸的是,我丢失了这篇文章的链接和来源,但我确实记得它是关于 C++ 中的元编程和模板的;在谈到模板方法的局限性时,这篇文章谈到了这样一个事实,即传递给模板的不是泛型类型,而是具有相关地址的类型(或可寻址的,我不记得确切的词了)可以作为参数传递给模板。
有人可以阐明地址、类型和模板之间的这种关系吗?
类型可以用地址来标识吗?
编辑
例如at this link ,在链接的常见问题解答的最后一部分,模板系统被描述为采用地址而不是通用类型的东西。
最佳答案
我不知道您阅读的原始文章,但您在编辑中链接到的常见问题解答没有谈论类型和地址之间的联系。
它讨论了一种特定类型的模板参数,即非类型参数。模板参数分为三种:类型、非类型和模板。所以这是专门针对第二种的。
非类型参数的一个例子是下面定义中的 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
不幸的是,它不是这样工作的——这就是常见问题解答文章的内容。它解释了对于非类型模板参数,您必须使用常量表达式,并且在这种特殊情况下,您必须使用具有外部链接的对象的标识符,而不仅仅是文字。所以你能做到的唯一方法是:
template <const char *Id>
struct C
{
};
char id1[] = "foo";
char id2[] = "bar";
int main()
{
C<id1> c1;
C<id2> c2;
/*...*/
return 0;
}
这就是 FAQ 文章的解释。
但是,这是一个非常特殊的情况,因为它仅适用于地址类型的非类型参数。请注意与的连接addresses 是因为非类型参数被显式指定为指针类型的参数 const char *
。
最常用的模板可以说是使用整数、枚举或用户定义类型的类型参数或非类型参数。这些都与内存地址无关。使用模板和使用内存地址之间没有隐含的联系。
关于C++ 类型是地址的抽象? - C++ 模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12887379/