gpt4 book ai didi

c++ - 了解 Webkit 中使用的 C++ 模板代码

转载 作者:行者123 更新时间:2023-11-28 06:32:45 25 4
gpt4 key购买 nike

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

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 不匹配任何模板声明”

最佳答案

你的理解是正确的。 bool 仍然允许在方法的模板上变化,并且特化是针对类的。

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

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

模板可用于实现完全通用的类(如 std::vector),但也可以在您认为不太可能实现时代替虚方法需要多个实现才能从代码重用中受益。

至于g++ 4.1.0,我刚刚查了一下,已经快9年了! So many bugs从那时起,与模板相关的问题就得到了修复,如果您要对它们进行任何重要的操作,那么升级确实值得一试。

关于c++ - 了解 Webkit 中使用的 C++ 模板代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27232476/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com