我目前正在为现有的类编写包装器。在不更改任何直接使用现有类的客户端代码的情况下编写包装器的最佳方法是什么?
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中的任何代码的情况下,使模板包装器类工作的最佳方法是什么?
修改
答案 0 :(得分:3)
您需要通过A
实例调用它:
wrappedA.myObject.foo();
你的包装器不是一个非常聪明的包装器,所以你需要知道它包含一个名为myObject
的实例。你可以通过给它一个转换运算符来使它变得聪明:
template<typename T>
class Wrapper
{
public:
T myObject;
operator const T& () const { return myObject; }
operator T& () { return myObject; }
};
这样您就可以在需要A
的地方使用它:
void bar(const A& a) { a.foo(); } // (make A::foo() a const method)
Wrapper<A> a;
bar(a); // OK
答案 1 :(得分:2)
提供运营商 - &gt;如果必须使用 - >返回指向包装类的指针访问方法不是问题:
template
class Wrapper
{
public:
T* operator->() { return &myObject; }
T const* operator->() const { return &myObject; }
...
};
但是如果你真的想用dot来访问方法,那么可能从T派生Wrapper? (但是你的课程根本不是一个包装工具:D)
答案 2 :(得分:2)
使用wrappedA.myObject.foo();
代替wrappedA.foo();