用于智能指针实现的隐式转换

时间:2016-05-14 21:52:30

标签: c++ memory memory-management smart-pointers

我正在尝试实现一个用于教育目的的智能指针类。当U类是T类的基础时,我希望能够做到以下几点。

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

我很难实现这种隐式演员,所以有人可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:2)

以下是使用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;
}

班级Bar派生自班级Foo,因此可以Example<Foo>初始化Example<Bar>

同样如预期的那样,以下程序无法编译:

#include <example.h>

class Foo {};
class Baz {};

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

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