【问题标题】:Template Classes in C++ ... a required skill set?C ++中的模板类......所需的技能?
【发布时间】:2010-12-16 04:24:24
【问题描述】:

我是 C++ 新手,想知道我应该花多少时间来学习如何实现模板类。它们在工业中被广泛使用,还是我应该快速完成?

【问题讨论】:

  • 为什么这个标签是 oop?我有时认为“oop”已经成为一种神奇的填充词,每个人都必须经常说,以确保他们被视为优秀的程序员。有点像“请”或“阿门”。
  • 这就是他们发明 PODO 的原因,不是吗? ;)
  • @jalf:请记住,模板通常用作避免 OOP 的一种方式。 std::list 是一种具有通用列表制作技术的方法,其中元素不必从 Object 或其他继承。
  • @David Thornley:是的,我同意,但这就是我的意思。如果一个问题是专门关于非 OOP 技术的,为什么要标记它 OOP?
  • 这应该被标记为anti-OOP。 smalltalk 死了 - Nietsche

标签: c++ oop templates class


【解决方案1】:

当然,它们用于工业。看看标准模板库 (STL)!

您绝对应该知道如何使用模板,并且最好学习如何使用它们做一些花哨的事情,比如模板元编程,好吧,这可能是可选的,但模板类不是!

编辑:更重要的是,许多其他语言,如 Java 和 C# 都支持泛型的概念,这相当于 C++ 中的模板,但泛型的限制要大得多。

【讨论】:

  • 泛型不是模板。它们受到的限制要多得多。
  • 在其他语言中是等价的。感谢您的指正。英语不是我的母语,所以有时我不知道如何正确表达。
【解决方案2】:

在我的雇主那里,我们在 C++ 中而不是在 C 中使用的 ma​​in 确实是泛型,也称为“模板”。继承 &c 很好(但有优缺点),但模板绝对至关重要 -- C++ 相对于普通 C 的主要、低成本优势。掌握它们,你不会浪费时间!-)

【讨论】:

  • 泛型不是模板。模板不是泛型。
  • 当然模板是用于泛型编程的——Austern 的书“泛型编程和 STL”是在 C# 甚至在微软眼中的微光之前编写的! “泛型编程”是一种编程范式(比如“函数式编程”),“泛型”是实现它的实体,而模板是 C++ 的泛型。
  • +1 对 Alex 的评论。人们过于沉迷于用于 C# 泛型之类的特定名称,而忘记了它也是一个可以泛型使用的词。
  • Alex:我明白你的意思,但我不确定我是否同意。我会说“泛型”是用 C#/Java 实现的构造的特定名称。 “通用编程”是一个更笼统的概念。我认为当您说模板是 C++ 泛型时,它只会给人一种错误的印象。它们用于 C++ 中的泛型编程,但它们不是泛型。
  • 我认为 C++ 很酷的另一件事是 RAII。脏清理 goto 可以用临时对象声明漂亮地替换。使用 lambda 和 shared_ptr 会更好。
【解决方案3】:

除了别人说的,它们在你自己的代码中非常有用,而且你在阅读别人的代码时肯定会遇到它,所以学习它没有坏处。

【讨论】:

  • +1 - 我什至会让它更清晰:即使您不需要它们,作为 C++ 程序员,您也需要了解它们。否则,就像“我说一口流利的西班牙语,只是不能在餐厅点餐”
【解决方案4】:

如果您在 Windows 上编写代码,如果不掌握 C++ 中的模板,您将无法走多远。 ATL、STL 和其他各种 Windows 库大量使用模板。

旁注*。如果您使用 Visual Studio,您可能想了解 Visual Studio 中用于支持模板的怪癖。例如,许多 Windows 库经常在头文件中声明其全部内容以解决链接器错误。这很烦人,但这个限制往往是新手使用 Visual Studio 学习 C++ 的绊脚石。

【讨论】:

    【解决方案5】:

    你迟早会需要它们;)但是对于初学者来说,它们编写起来有点棘手(但易于使用,因此请大量使用 STL)。在掌握了其他 c++ 技能(常量正确性、运算符重载、了解编译单元等)并获得一些经验之后,您将开始为自己编写模板。所以我的建议是:使用它们,但是当你发现你需要它们时学习如何编写它们。如果您先获得一些标准 c++ 结构的经验,学习起来会更快、更有效。

    【讨论】:

    • +1:使用和创建之间有明显的区别。如果第一个是必需的,那么第二个真的取决于一个人想要完成什么(而且更棘手)。
    【解决方案6】:

    不,不要花太多时间学习如何实施它们。其他答案正确地解释了您当然应该学习如何使用它们。这就说得通了;许多库提供类模板,您应该学习使用这些库。但是编写自己的模板要少得多。

    【讨论】:

    • 这是一项有用的技能,但不是第一个学习的。
    • 很多东西都不是“先学”的。但这取决于原始海报试图做什么。换句话说,学习一门语言以将其列入您所知道的语言列表与学习一门语言以使用它是有区别的。如果原始海报想做后者,模板很重要。如果是前者……就没有那么多了。
    【解决方案7】:

    我想说理解模板是现代 C++ 风格和习语以及充分利用该语言的必要条件。它们并不像人们通常认为的那样困难。如果您是初学者,我绝对推荐像 Accelerated C++ 这样的书,它对模板进行了非常温和自然的介绍。

    【讨论】:

      【解决方案8】:

      正如其他人所指出的,模板是 C++ 语言中非常重要的一部分。事实上,它们本身就是一种图灵完备的语言;) 然而,不仅 STL 大量使用模板(曾经使用过 std::vector 或 std::pair?),许多其他库也这样做……最值得注意的可能是 boost。我希望这能让您了解它们的重要性。

      您绝对应该学习的是如何在类和函数的上下文中使用它们。掌握了这一点后,您可以继续学习更高级的主题,例如模板专业化或模板模板参数。 如果您仍然没有足够的模板,您可以查看 “C++ 模板:完整指南”,作者 Nicolai M. Josuttis 和 Andrei Alexandrescu 的“现代 C++ 设计”。尽管后者确实很难理解。

      首先,此资源http://www.parashift.com/c++-faq-lite/templates.html 也可能会有所帮助:)

      还请注意,泛型不是“C#/Java 中的模板”,反之亦然……它们遵循不同的概念。

      【讨论】:

      • +1,虽然我不确定我是否会选择向量/对作为“大量使用模板”的示例;)
      猜你喜欢
      • 1970-01-01
      • 2023-04-11
      • 1970-01-01
      • 1970-01-01
      • 2010-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多