C++ 通用包装器类,它为某些函数添加了额外的处理

标签 c++ c++11 c++14 generic-programming

我正在尝试为遗留继承层次结构创建一个包装类,它不是严格意义上的多态。在包装类中,我为一些方法添加了额外的功能,但对于许多其他方法,我只想调用包装类方法。

我想知道是否有一种方法可以在包装类中编写通用包装函数,这样我就可以像没有包装类一样以正常方式调用包装函数。

可能我错了,但我不认为重载 operator-> 会起作用,因为包装类有一些方法,我想在调用包装类函数之前对其进行一些处理(尽管对于许多其他人,我不需要这样做)。

我还查看了 Herb Sutter 的包装器模式(同样,我可能是错的),但这需要我有一个 lambda 来访问包装函数。

我想知道是否有人对这是否可以实现有任何想法?

我已经把代码放在了@ cpp.sh/2ombu
这里代替

wrapper->operator()([](Derived& x)
{
   x.print();
});

wrapper->operator->()->print();

有什么办法可以让我拥有

wrapper->print();

提前感谢您的回答..

最佳答案

你的问题是你实际上使用了指针。

目前,而不是

wrapper->operator->()->print();

你可能会写

(*wrapper)->print();

如果你替换不需要的指针

wrap<Derived> *wrapper = new wrap<Derived>(der);

通过

wrap<Derived> wrapper(der);

然后,你可以替换

wrapper->operator->()->print();

通过

wrapper->print();
// or wrapper.operator->()->print(); :)

同样的道理

wrapper->operator()([](Derived& x)
    {
       x.print();
    });

会变成

wrapper(([](Derived& x)
    {
       x.print();
    });

关于C++ 通用包装器类,它为某些函数添加了额外的处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51519082/

相关文章:

c++ - 如何简化模板模板参数中的enable_if别名

c++ - 将set函数(setter)标记为constexpr的目的是什么?

c++ - 存在多态性编译问题的简单文件

c++ - 对另一个类中的一个类使用重载运算符

c++父子类中的同名成员

C++ 使用默认值在 Struct 中实例化 2D Vector

c++ - 为什么 std::begin 和 std::end "not memory safe"?

c++ - 为什么移动语义与动态内存分配中的浅拷贝具有相同的行为?

c++ - 如何让所有输入都在同一行 C++

c++ - box2d 迭代