智能指针实现的隐式转换

implicit cast for smart pointer implementation

我正在尝试实现一个智能指针 class 用于教育目的。当 class U 是 class T 的基时,我希望能够执行以下操作。

ptr<T> t;
ptr<U> u = t; 

我正在努力实现这个隐式转换,有人可以帮助我吗?

这是使用 std::is_base_of 实现此目的的示例。

example.h中:

#include <type_traits>

template <typename T>
class Example {
public:
  template <
    typename T2,
    typename = typename std::enable_if<std::is_base_of<T, T2>::value>::type
  >
  Example (const Example<T2> &) {}

  Example () = default;
};

不出所料,以下程序编译成功:

#include <example.h>

class Foo {};
class Bar : public Foo {};

int main (int argc, char * argv []) {
  Example<Bar> bar;
  Example<Foo> foo = bar;
}

Class Bar 派生自 class Foo,因此可以从 Example<Bar>.[=24 初始化 Example<Foo> =]

同样如预期的那样,以下程序编译失败:

#include <example.h>

class Foo {};
class Baz {};

int main (int argc, char * argv []) {
  Example<Baz> baz;
  Example<Foo> foo = baz;
}

Class Baz 与 class Foo 无关,因此无法从 Example<Baz> 初始化 Example<Foo>。 Clang 提供以下错误消息:error: no viable conversion from 'Example<Baz>' to 'Example<Foo>'.