c++ - c++中的扩展方法

标签 c++ c++11

我正在寻找 C++ 中扩展方法的实现,结果发现了 this comp.std.c++ discussion其中提到 polymorphic_map 可用于将方法与类相关联,但是,提供的链接似乎已失效。有谁知道那个答案指的是什么,或者是否有另一种方法可以以与扩展方法类似的方式扩展类(也许通过使用 mixins?)。

我知道规范的 C++ 解决方案是使用自由函数;这更多是出于好奇。

最佳答案

不同的语言以不同的方式进行开发。特别是 C# 和 Java 对 OO 有很强的观点,这导致 everything is an object 心态(C# 在这里稍微松懈一些)。在这种方法中,扩展方法提供了一种扩展现有对象或接口(interface)以添加新功能的简单方法。

C++ 中没有扩展方法,也不需要它们。在开发 C++ 时,忘记一切都是对象范式——顺便说一句,即使在 Java/C# [*] 中也是错误的。在 C++ 中采用了不同的思维方式,存在对象,并且对象具有本质上是对象一部分的操作,但也有其他操作构成接口(interface)的一部分,而不必是类的一部分。 Herb Sutter 必读的是 What's In a Class? ,作者捍卫(我同意)您可以使用简单的自由函数轻松扩展任何给定的类。

作为一个特别简单的例子,标准模板类basic_ostream有一些成员方法来转储一些原始类型的内容,然后通过使用现有的公共(public)接口(interface)将该功能扩展到其他类型的(也是模板化的)自由函数来增强它。例如,std::cout << 1;被实现为成员函数,而 std::cout << "Hi";是根据其他更基本的成员实现的自由函数。

C++ 中的可扩展性是通过自由函数实现的,而不是通过向现有对象添加新方法的方式。

[*] 一切都不是对象。

在给定的域中将包含一组可以建模的实际对象和可以应用于它们的操作,在某些情况下,这些操作将是对象的一部分,但在其他情况下它们不会。特别是您会发现 实用程序类 在声称一切都是对象的语言中,而那些 实用程序类 只不过是一个试图隐藏这些方法没有的事实的层' t 属于任何特定对象。

即使是作为成员函数实现的某些操作也不是对对象的真正操作。考虑添加 Complex号码类,sum怎么样(或 + )对第一个参数的操作比对第二个参数的操作更多?为什么a.sum(b);b.sum(a) , 不应该是 sum( a, b ) ?

将操作强制为成员方法实际上会产生奇怪的效果——但我们只是习惯了它们:a.equals(b);b.equals(a);即使执行 equals 也可能有完全不同的结果是完全对称的。 (考虑当 ab 是空指针时会发生什么)

关于c++ - c++中的扩展方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5463009/

相关文章:

c++ - VC++ 调试器 - 评估虚函数,CXX0052 : Error: member function not present

c++ - 在 C++ 中使用 <random>

c++ - C++17 中新的基于范围的 for 循环如何帮助 Ranges TS?

C++11 线程等待行为:std::this_thread::yield() 与 std::this_thread::sleep_for( std::chrono::milliseconds(1) )

c++ - 检查类型实例是否可以流式传输

c++ - 如何在 C++ 中实现自然排序算法?

c++ - 如何在 STL 堆栈中保存用户定义的类型?

c++ - return 语句是否会阻止递归堆栈继续?

c++ - 部分模板绑定(bind),创建新模板作为类型

c++ - 为什么在 const 成员结构中需要构造函数?