【问题标题】:Understanding c++ template code used in Webkit了解 Webkit 中使用的 c++ 模板代码
【发布时间】:2014-12-01 16:11:57
【问题描述】:

我正在寻找 http://trac.webkit.org/browser/trunk/Source/JavaScriptCore/parser/Lexer.hhttp://trac.webkit.org/browser/trunk/Source/JavaScriptCore/parser/Lexer.cpp
在第196行的标题中,有一段代码

template <bool shouldBuildIdentifiers> ALWAYS_INLINE JSTokenType parseIdentifier(JSTokenData*, unsigned lexerFlags, bool strictMode);

我可以在 cpp 文件中看到一个 实现

template <>
template <bool shouldCreateIdentifier> ALWAYS_INLINE JSTokenType Lexer<LChar>::parseIdentifier(JSTokenData* tokenData, unsigned lexerFlags, bool strictMode)

我对语法的理解是,我们正在为 LChar 类型的 Lexer 定义/专门化函数。它是否正确? 我读到 (Why can templates only be implemented in the header file?) 理想情况下这应该在头文件中完成。

旧的 C++ 编译器也支持这种语法吗?我的是 mips-linux-g++ v 4.1.0。我收到“模板 ID 与任何模板声明都不匹配”

【问题讨论】:

    标签: c++ templates webkit


    【解决方案1】:

    你的理解是正确的。 bool 仍然允许在方法的模板上有所不同,并且专门针对类。

    虽然模板通常是专门化的并在头文件中实现,但另一种方法是为专门化添加前向声明,编译器会找到它。然而,实现必须从另一个文件链接,就像任何其他具有单独声明和定义的函数一样。这样做的缺点是,如果没有链接时间优化,内联就不会发生,但优点是使用模板时需要解析的代码要少得多。在大型项目中,这可以显着缩短编译时间。

    在这种情况下,该类的实现者已经决定只有两种方法可以实例化该类,即 LChar 和 UChar(参见第 1930 行的注释)。因此,他们可以将他们的实现放在 .cpp 文件中,并通过在文件底部实例化两个模板,一切都在那个阶段得到解决。

    模板可用于实现完全通用的类(如std::vector),可以期待任何东西,但也可以在您认为不太可能需要多个实现的情况下代替虚拟方法仍然受益于代码重用。

    至于g++ 4.1.0,我刚查了一下,已经快9岁了!从那时起,与模板相关的So many bugs 已得到修复,如果您对它们做任何不重要的事情,那么真的值得尝试升级。

    【讨论】:

    • "bool 仍然允许在方法的模板上变化,并且专门针对类。"这是什么意思?返回类型是布尔型吗?
    • 在这种情况下,总共有两个模板参数。一种适用于类(template &lt;typename T&gt; class Lexer 中的T),第二种适用于方法(bool shouldCreateIdentifier)。我们将T 设置为LChar,但我们仍然让shouldCreateIdentifier 采用不同的值。这也称为部分专业化。
    • 这是否意味着 shouldCreateIdentifier 可以有 bool 以外的其他类型?
    • 不,它必须是bool。模板参数可以是类型名,也可以是整数类型/枚举。还有一些其他很少使用的,see 14.1.4 and 14.1.5 of the C++ standard 用于血淋淋的细节)。这里,bool 实际上是一个整数类型,唯一允许的值是truefalse。另一个你更常看到完整模板参数的地方是std::array
    • gcc.gnu.org/projects/cxx0x.html 详细介绍了编译器对 C++ 特性的支持
    猜你喜欢
    • 1970-01-01
    • 2011-08-25
    • 1970-01-01
    • 2022-01-16
    • 2017-03-29
    • 1970-01-01
    • 2021-09-01
    • 2012-12-12
    • 1970-01-01
    相关资源
    最近更新 更多