智能指针实现的隐式转换
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>'
.
我正在尝试实现一个智能指针 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>'
.