我目前正在为现有类编写一个包装器。在不更改直接使用现有类的任何客户端代码的情况下编写包装器的最佳方法是什么?
class A
{
public:
void foo() {}
};
template<typename T>
class Wrapper
{
// ...other wrapper data/functionality...
private:
T myObject;
};
main()
{
Wrapper<A> wrappedA;
wrappedA.foo();
}
在 msvc 中编译失败并出现错误 C2039:“foo”:不是“Wrapper”的成员
在不更改 main 中的任何代码的情况下使模板包装类工作的最佳方法是什么?
- 选择运算符。不能超载
- 将强制转换运算符写入类型 T 没有帮助,因为编译器在进行选择之前不会尝试强制转换
- 我们可以编写一个 get 函数来返回内部的 myObject 成员,但 main 中的客户端代码必须重写。如果有大量现有代码直接使用 myObject 而没有我们正在尝试编写的新包装类,这并不好。
编辑
- 我想在 myObject 上编写一个包装类,而不必更改任何直接使用 myObject 的现有客户端代码
- A::foo() 不能被带入包装器,因为其他类型 T 可能没有 T::foo()