草庐IT

C++ 模板(泛型编程)与多态性?

coder 2024-02-02 原文

我想通过说它与范式相关并且我只是想澄清一些概念来开始这个问题。所以我已经用 Python 编程大约 2 年了,我涉足 Java 但不是太多,我想深入研究 C++。我以前用过它,但没有用于涉及大量设计的大型项目。

当我第一次开始探索它时,我认为它处理 OOP 的方式与 Java 类似,在 Java 中一切都必须实现一个接口(interface)。然后我碰到了 templates 的概念,我立即认为它是为基元(intsfloats)提供多态行为的变通方法不实现它(基本上是 Python 通过鸭子类型和没有正式接口(interface)所做的)。但我很快发现模板用于为非基本类型提供相同的行为。

所以我的问题是:有什么理由在模板上使用经典多态性,C++ 社区对此的一般方法是什么?

编辑 刚刚找到this这几乎回答了这个问题(静态多态性我真的需要围绕这个术语来思考)。

最佳答案

冒着一概而论的风险,模板在大多数情况下的使用类似于 Java 中的泛型 - 它们允许您构建可用于许多不同数据类型的类或函数。取std::list ,标准模板库的一部分。您可以使用 std::list<int> 创建一个整数链表,或带有 std::list<MyClass> 的对象列表.另一个例子是 std::thread ,它使用模板获取函数(或 lambda 或仿函数)及其参数以在另一个线程中运行。

至于在函数之间进行选择f(SomeInterface x)和一个函数模板 f(T x) ,它确实取决于上下文并且有些主观。需要考虑的一些事项是:

  • 函数模板和类模板在编译时解析,因此您可以获得更好的性能。然而,

  • C++ 编译器历来会为模板错误生成难以辨认的垃圾。 Clang 已经做了一些工作来改进这一点,其他编译器也在努力匹配 Clang。情况正在好转,但仍然很难看。

  • 不要害怕对接口(interface)和实现类使用传统的多态性。虽然在某些情况下使用模板代替多态(参见 C++ 的 std::thread 使用模板与 Java 的 Thread 使用 Runnable 接口(interface)),多态在 C++ 库和项目中仍然非常普遍。

简而言之,请随意考虑使用模板,但不要将它们视为多态性的替代品。查看一个流行的 C++ 库,您一定会发现大量的多态性。以流行的 C++ 图形引擎 OGRE 为例。如果你看看它的 class list ,您会发现许多接口(interface)(例如 WindowEventListenerFrameListener ),用户可以从中派生类以便与库交互。

关于C++ 模板(泛型编程)与多态性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13457530/

有关C++ 模板(泛型编程)与多态性?的更多相关文章

  1. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  2. ruby - 通过 erb 模板输出 ruby​​ 数组 - 2

    我正在使用puppet为ruby​​程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby​​不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这

  3. ruby - 寻找通过阅读代码确定编程语言的ruby gem? - 2

    几个月前,我读了一篇关于ruby​​gem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:

  4. ruby - 使用 `+=` 和 `send` 方法 - 2

    如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:

  5. 网络编程套接字 - 2

    网络编程套接字网络编程基础知识理解源`IP`地址和目的`IP`地址理解源MAC地址和目的MAC地址认识端口号理解端口号和进程ID理解源端口号和目的端口号认识`TCP`协议认识`UDP`协议网络字节序socket编程接口`sockaddr``UDP`网络程序服务器端代码逻辑:需要用到的接口服务器端代码`udp`客户端代码逻辑`udp`客户端代码`TCP`网络程序服务器代码逻辑多个版本服务器单进程版本多进程版本多线程版本线程池版本服务器端代码客户端代码逻辑客户端代码TCP协议通讯流程TCP协议的客户端/服务器程序流程三次握手(建立连接)数据传输四次挥手(断开连接)TCP和UDP对比网络编程基础知识

  6. ruby-on-rails - Mandrill API 模板 - 2

    我正在使用Mandrill的RubyAPIGem并使用以下简单的测试模板:testastic按照Heroku指南中的示例,我有以下Ruby代码:require'mandrill'm=Mandrill::API.newrendered=m.templates.render'test-template',[{:header=>'someheadertext',:main_section=>'Themaincontentblock',:footer=>'asdf'}]mail(:to=>"JaysonLane",:subject=>"TestEmail")do|format|format.h

  7. ruby - Chef Ruby 遍历 .erb 模板文件中的属性 - 2

    所以这可能有点令人困惑,但请耐心等待。简而言之,我想遍历具有特定键值的所有属性,然后如果值不为空,则将它们插入到模板中。这是我的代码:属性:#===DefaultfileConfigurations#default['elasticsearch']['default']['ES_USER']=''default['elasticsearch']['default']['ES_GROUP']=''default['elasticsearch']['default']['ES_HEAP_SIZE']=''default['elasticsearch']['default']['MAX_OP

  8. ruby - 如何计算 Liquid 中的变量 +1 - 2

    我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我

  9. ruby - 我正在学习编程并选择了 Ruby。我应该升级到 Ruby 1.9 吗? - 2

    我完全不是程序员,正在学习使用Ruby和Rails框架进行编程。我目前正在使用Ruby1.8.7和Rails3.0.3,但我想知道我是否应该升级到Ruby1.9,因为我真的没有任何升级的“遗留”成本。缺点是什么?我是否会遇到与普通gem的兼容性问题,或者甚至其他我不太了解甚至无法预料的问题? 最佳答案 你应该升级。不要坚持从1.8.7开始。如果您发现不支持1.9.2的gem,请避免使用它们(因为它们很可能不被维护)。如果您对gem是否兼容1.9.2有任何疑问,您可以在以下位置查看:http://www.railsplugins.or

  10. ruby - 如何以编程方式删除实例上的 "singleton information"以使其编码(marshal)? - 2

    我创建了一个由于“在运行时执行的单例元类定义”而无法编码的对象(这段代码的描述是否正确?)。这是通过以下代码执行的:#defineclassXthatmyusesingletonclassmetaprogrammingfeatures#throughcallofmethod:break_marshalling!classXdefbreak_marshalling!meta_class=class我该怎么做才能使对象编码正确?是否可以从对象instance_of_x的classX中“移除”单例组件?我真的需要一个建议,因为我们的一些对象需要通过Marshal.dump序列化机制进行缓存。

随机推荐