C++类型是从地址抽象出来的?-C++模板
C++ types are abstraction from addresses? - C++ templates
不幸的是,我丢失了这篇文章的链接和来源,但我记得它是关于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
不幸的是,它不能这样工作–这就是常见问题解答文章的内容。它解释说,对于非类型模板参数,必须使用常量表达式,在这种特殊情况下,必须使用具有外部链接的对象的标识符,而不仅仅是文字。所以你能做到的唯一方法是:
template <const char *Id>
struct C
{
};
char id1[] = "foo";
char id2[] = "bar";
int main()
{
C<id1> c1;
C<id2> c2;
/*...*/
return 0;
}
这就是常见问题解答文章所解释的。
然而,这是一个非常特殊的情况,因为它只适用于地址类型的非类型参数请注意,之所以提供到地址的连接,是因为非类型参数被明确指定为指针类型const char *
的参数。
可以说,大多数常用模板都使用整型、枚举型或用户定义类型的类型参数或非类型参数。这些都与内存地址无关。使用模板和使用内存地址之间没有隐含的联系。
下面是一个用地址标识的类型示例:
int foo;
template <int *IP>
class Bar {
};
Bar<&foo> baz;
但不知怎么的,我不认为这是文章的意思。
类型本身在C++中没有地址。一个类型中的各个定义可能有也可能没有自己的地址。有些东西只在类型的实例中有地址。
我在那里使用的技巧只能用于程序整个生命周期中存在的对象。然后对象的地址成为类型名称的一部分。
模板甚至不是C++中的类型。当它们已经用一组特定的参数实例化时,它们只是一种类型。他们也没有地址。
- .cpp和.h文件中的模板专用化声明
- C++模板来检查友元函数的存在
- 如何使用默认参数等选择模板专业化
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- 部分定义/别名模板模板参数
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 如何在c++中为模板函数实例创建快捷方式
- 使用C++中的模板和运算符重载执行矩阵运算
- 有人能分解一下这个c++模板的语法吗
- 如何在c++17中制作一个模板包装器/装饰器
- 模板化建造师专业化
- 调用专用模板时出错"no matching function for call to [...]"
- 模板元程序查找相似的连续类型名称
- 如何在C++20中创建模板别名的推导指南
- 没有名称的C++模板参数
- 具有重复类型的C++可变模板
- 如何将enable-if与模板参数和参数包一起使用
- 没有用于初始化C++中的变量模板的匹配构造函数