智能指针实现的隐式强制转换



我正试图实现一个用于教育目的的智能指针类。当U类是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;
}

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>'

相关内容

  • 没有找到相关文章

最新更新