【问题标题】:C++ types are abstraction from addresses? - C++ templatesC ++类型是地址的抽象吗? - C++ 模板
【发布时间】:2012-10-14 22:56:29
【问题描述】:

很遗憾,我丢失了本文的链接和源代码,但我确实记得它是关于 C++ 中的元编程和模板的;在谈论模板方法的限制时,本文谈到传递给模板的内容不是泛型类型,而只是具有相关地址的类型(或可寻址的,我不记得确切的词)可以作为参数传递给模板。

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

类型可以用地址来标识?


编辑

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

【问题讨论】:

  • 类型大多只在编译时才知道(RTTI en.wikipedia.org/wiki/Run-time_type_information 是个例外)。地址在运行时没有定义的类型。 (例如 mallocmmap 的返回),因为通过将指针转换为不同的类型,您不会更改它包含的地址。
  • 我不确定你在这里问什么。您引用的常见问题解答条目是关于传递 non-type 模板参数。函数、积分等的地址就是这样。字符串文字是一个棘手的异常,它不能按您的预期工作,因此是常见问题解答条目。
  • 您确定您没有考虑 linkage 而不是“可寻址”吗?
  • 我的猜测是,这可能与您无法真正制作需要未实例化模板作为参数的模板有关。 C++ 模板扩展逻辑对已实例化和未实例化的模板有很大的区别,而未实例化的模板是一种幽灵般的东西,您只能在非常有限的一组上下文中引用。他们当然不是类型。只有实例化的模板才是类型。

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


【解决方案1】:

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

它讨论了一种特定类型的模板参数,非类型参数。模板参数分为三种:typenon-typetemplate。所以这里专门针对第二种。

一个非类型参数的例子是下面定义中的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 *的参数。

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

【讨论】:

    【解决方案2】:

    下面是一个用地址标识的类型示例:

    int foo;
    
    template <int *IP>
    class Bar {
    };
    
    Bar<&foo> baz;
    

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

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

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

    模板甚至不是 C++ 中的类型。只有当它们被一组特定的参数实例化时,它们才是一种类型。而且他们也没有地址。

    【讨论】:

    • 再次,很抱歉,我失去了这个良好的链接,它更多的是关于设计和通用限制,它谈论的是地址之类的地址,而不是指针或引用。更像是模板应该接受什么作为输入及其结构限制。
    • comeaucomputing.com/techtalk/templates/#stringliteral 混乱正在上升,但我认为那篇文章所说的内容与该链接上常见问题解答的最后部分类似。但我不记得这个地址到底是关于什么的......
    • @Ken:我也想到了“带有外部链接的名称对象”,但 g++ 对static 很满意。
    猜你喜欢
    • 1970-01-01
    • 2011-06-12
    • 1970-01-01
    • 1970-01-01
    • 2021-12-12
    • 2018-12-28
    • 2014-11-02
    • 2015-01-05
    • 2016-12-22
    相关资源
    最近更新 更多