首页 / C++ / C++如何使指针指向泛型的对象
C++如何使指针指向泛型的对象
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C++如何使指针指向泛型的对象,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1935字,纯文字阅读大概需要3分钟。
内容图文
![C++如何使指针指向泛型的对象](/upload/InfoBanner/zyjiaocheng/645/27e572b1234842d284cdbc4b013ab17f.jpg)
引言
这是一次在代码中遇到的一个小问题,在网上没有找到解答,遂在解决后分享出来,帮助有同样问题的朋友
直入主题 我们来看一段简单的代码来引入我们的问题
template<typename Type>
struct wrapper_type{
Type fun;
...
};
首先这是一个简单泛型对象的声明,假如现在有一个需求,就是我们需要一个智能指针指向一个泛型的对象呢?你也许会说,像往常一样不就好了,你也许是这个意思:
template<typename Type>
struct wrapper_type{
Type fun;
...
};
std::unique_ptr<wrapper_type<Type>> ptr_to_wrapper;
很不幸 错的很离谱,这个Type与上面类的声明中的类型差的很远,甚至作用域也不相同,我们该怎么办呢,解决的方法就是继承:
struct base_type{
...
};
std::unique_ptr<base_type> ptr;
template<typename T>
struct wrapper_type : base_type{
T fun;
...
};
这样的话我们就可以成功指向了,你也许会说这有什么用呢,举一个比较直观了例子,当我们进行并发编程的时候,我们可能会有一个可调用对象做接口的时候,一般情况下std::function表现良好,但是我们不得不注意到一个事实,就是std::function是可复制可移动的,而我们并发编程中常用的std::packaged_task是可移动不可复制的,这意味着我们要传递一个std::packaged_task的时候我们接口不可以使用std::function,这个时候需要我们自己写一个包装类,以上技巧就派上了用场
class function_wrapper{
struct base_type{
virtual void call() = 0;
virtual ~base_type() {}
};
std::unique_ptr<base_type> ptr;
template<typename T>
struct wrapper_type : base_type{
T fun;
wrapper_type(T&& f) : fun(std::move(f)){}
void call() override {fun();}
};
public:
template<typename T>
function_wrapper(T&& f) :
ptr(new wrapper_type<T>(std::move(f))){}
function_wrapper() = default;
function_wrapper(function_wrapper&& f) : ptr(std::move(f.ptr)){}
void operator()() {ptr->call();}
function_wrapper& operator=(function_wrapper&& f){
ptr = std::move(f.ptr);
return *this;
}
function_wrapper(const function_wrapper&) = delete;
function_wrapper(function_wrapper&) = delete;
function_wrapper& operator=(const function_wrapper&) = delete;
};
参考:
C++ concurrency in action
内容总结
以上是互联网集市为您收集整理的C++如何使指针指向泛型的对象全部内容,希望文章能够帮你解决C++如何使指针指向泛型的对象所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。