c++ - 是否有围绕类添加方法的最薄包装器之类的东西?

标签 c++ methods overriding wrapper

据我了解,C++ 没有像 ObjC 那样具有向现有类添加方法的机制(例如,QString,但请不要关注它是 Qt 函数这一事实);让我们假设这些新方法不需要任何新的成员变量。相反,唯一的选择是创建一个包装类(例如,KString),它继承 A 并添加所需的方法(例如,toFoo())。

但是,这需要在你想使用新方法的任何地方进行修改,比如

static_cast<KString*>(ptrToQStringInstance)->toFoo()

但是如果有很多这样的地方,您希望能够在相关文件中使用#define QString KString(或进行等效的搜索/替换)。

当然你会遇到像“没有从 [const] QString 到 [const] KString 的可行转换”这样的错误,为此你必须添加一个复制构造函数,比如

inline KString(const QString &that)
{
    *(static_cast<QString*>(this)) = that;
}
// add an assignment operator for good measure too
inline KTEStringView &operator=(const QString &other) Q_DECL_NOTHROW
{
    *(static_cast<QString*>(this)) = other;
    return *this;
}

我的问题: - 是否有一组定义明确且有限的方法(独立于父类)您必须以这种方式实现(覆盖),或者您是否正在考虑覆盖所有返回 QString 的方法,努力避免深拷贝? - 这是最好的方法还是您可以使用使它更“优雅”的语言结构(例如 using 或某种奇特的方法分配)?

谢谢!

编辑:你为什么要这样做:当你现有的类来自旧版本的库,而你使用的依赖代码想要使用来自该库的新版本的东西。在 ObjC 中,我定期进行这种扩展以向 NSWindow 或 NSString 添加便利方法,这样我就可以调用它们,就好像它们是由 SDK 提供的一样,而不必强制转换为专用的子类或调用采用该类的全局函数实例作为参数。

Edit2:这是另一个例子,这次是公开的 Qt 相关。它为还没有此功能的 Qt 版本添加了 QQuickItem::size() 的替代方案:

template <class QtType>
class Q510QI : public QtType
{
public:
#if QT_VERSION < QT_VERSION_CHECK(5, 10, 0)
    QSizeF size()
    {
        return QSizeF(QtType::width(), QtType::height());
    }
#endif
};
#define Q510QIPCAST(instanceptr) static_cast<Q510QI<std::decay<decltype(*instanceptr)>::type>* >(instanceptr)

这允许我用 Q510QIPCAST​​(foo)->size() 替换 foo->size()(其中 foo 指向 QQuickItem 或继承它)。

显然我可以用一个免费的模板函数来完成这个(它不需要 decltype 和 std::decay)但是那个函数需要有一个针对较新的 Qt 版本的显式实现(调用实际的 QQuickItem::size () 方法)。如果我想添加一系列其他琐碎的方法,我会添加尽可能多的 #if/#else/#endif,而在这里我可以只在单个 # 之间添加那些琐碎的函数如果/#endif.

最佳答案

C++ 不提供 extension methods ,正如其他语言(如 C#)可能建议的那样。

C++方式是添加自由函数或使用继承。

Uniform function call syntax提案可能允许使用您期望的语法(使用自由函数方式)。

关于c++ - 是否有围绕类添加方法的最薄包装器之类的东西?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57073349/

相关文章:

c++ - 如何在一个循环中分离两个不同的数组?

java - 关于Java函数调用

java - 未重写的公共(public)实例方法是否动态绑定(bind)?

c++ - 如何将模板变量更改为特定类型或不让它成为空指针

c++ - 如何在wxwidgets中拖动窗口大小?

java - 如何将字符串数组传递给另一个方法?

java - 继承和覆盖模块项目中相同bean id的bean属性

asp.net-core - IComponents View 的 Nop Commerce 自定义 View 引擎在 nopcommerce 4.0 中不起作用

c++ - 迭代器在与临时容器交换后变得无效

algorithm - 多个排名列表的总排名