【问题标题】:Are two typelists spliceable in a constant time?两个类型列表是否可以在恒定时间内拼接?
【发布时间】:2011-07-16 13:50:24
【问题描述】:

我正在使用 Alexandrescu 的 Modern C++ Design 中定义的类型列表。 在他的书中,他谈到了将类型附加到类型列表,但他没有谈到拼接两个类型列表......

我想可以使用 Append 功能拼接两个类型列表,但它不会导致线性时间拼接(而 std::list::splice 是 O(1) )。 ?

好吧,我知道这个计算时间可以被视为“免费”,因为它是编译时间,但我很好奇 :)

谢谢!

【问题讨论】:

    标签: c++ metaprogramming splice typelist


    【解决方案1】:

    类型列表的概念通常* 比std::list 的(双)链表更接近计算机科学的列表概念。这两个想法同名,但有重要的区别。

    由于元程序是纯函数式的,您不能像std::list::splice 那样就地修改输入类型列表:您必须“生成”输出类型列表,这将是线性的。 (但是,惰性可以用来推迟和降低该成本;所支付的确切成本将取决于最终算法。)

    *:我说通常是因为 Boost.MPL 支持诸如迭代器和视图之类的东西,它们模糊了界限,至少从用户的角度来看是这样。

    (为了论证,假设这里的“CS”列表是指 cons 单元格 + 空列表。)

    【讨论】:

    • std::list 是“计算机科学”列表的完美示例。 CS 也处理可变数据结构,std::list 是一个非常普通的双向链表示例。也许您的意思是它更接近于列表的函数式编程概念(单链接且不可变)?
    • @jalf 我不想为“CS”列表的定义提供参考,我认为这与手头的内容不太相关。第一段仅作为警告不要假设类型列表上可用的操作类似于std::list上可用的操作仅基于名称。第二段是它的所在(这里问题的关键是pure FP)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-23
    • 2016-11-13
    • 2021-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多