c++ - 自动将 A* 转换为 B*

标签 c++ proxy smart-pointers conversion-operator

假设我得到了一个类 A。我想将指向它的指针包装到一个小类 B 中,某种智能指针,具有 B* 自动转换为 A 的约束* 这样我就不需要重写已经使用了 A* 的代码。

因此我想修改 B 以便下面的编译...

struct A {
  void foo() {}
};

template <class K>
struct B {
  B(K* k) : _k(k) {}
  //operator K*() {return _k;}
  //K* operator->() {return _k;}
private:
  K* _k;
};

void doSomething(A*) {}

void test() {
  A a;
  A* pointer_to_a (&a);
  B<A> b (pointer_to_a);
  //b->foo();             // I don't need those two...
  //doSomething(b);

  B<A>* pointer_to_b (&b);

  // Following represents existing code I don't want to change...
  pointer_to_b->foo();       // 'foo' : is not a member of 'B<K>'
  doSomething(pointer_to_b); // 'doSomething' : cannot convert parameter 1 from 'B<K> *' to 'A *'
}

请注意,B 继承自 A 不是一个选项(A 的实例是在我无法控制的工厂中创建的)...

这可能吗?

谢谢。

最佳答案

pointer_to_b 的类型是指向B 的指针,这是一个你不能修改的类型;它由编译器实现。

您可以执行 (*pointer_to_b)->foo(),这将做正确的事情(假设您有重写的运算符->())。但是,如果您将 pointer_to_be 传递给它,那不会让其他代码做正确的事情。

另外让我补充一点,您可以覆盖 B 上的 operator& 以返回 A*,这可能会解决您的问题,具体取决于具体用例。

关于c++ - 自动将 A* 转换为 B*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2715340/

相关文章:

c++ - libcURL 和谷歌文档

java - 在 Spring 中通过代理创建和初始化惰性类实例

javascript - Nodejs,观察类字段的变化

c++ - 带有用 C 编写的库的智能指针

c++ - ICU 探测所有货币符号

C++ 刽子手游戏

http - 使用 HTTP 连接到代理服务器以获取 HTTPS 请求安全吗?

c++ - 这个智能指针使用有什么问题?

c++ - shared_ptr 隐式转换在这里失败而在那里成功?

c++ - 调用 CComModule.RegisterServer、_AtlComModule.RegisterServer 和 LoadTypeLibEx 进行 TypeLib 注册有什么区别?