【发布时间】:2017-05-04 19:00:44
【问题描述】:
我正在尝试声明一个检查智能指针是否已初始化的函数。我写了两个作用于智能指针的函数变体,一个作用于模板的模板函数,一个作用于模板的模板。问题是,后者应该至少作用于 std::unique_ptr 和 std::shared_ptr。 std::unique_ptr 的构造与 std::shared_ptr 不同。 std::unique_ptr 一个接受两个模板参数(即对象类型和删除器),而 std::shared_ptr 一个只接受一个(即对象类型)。
#include <iostream>
#include <memory>
template <typename Smartpointer>
void checkPointerinitialization(const Smartpointer& ptr){
if(!ptr.get())
std::cout<<"smart pointer is not initialized\n"<<std::endl;
}
//template <template <typename, typename> class Smartpointer, typename Object, typename Deleter>
//void checkPointerinitializationWithTemplates(const Smartpointer<Object, Deleter>& ptr){
// if(!ptr.get())
// std::cout<<"smart pointer is not initialized in template function either\n"<<std::endl;
//}
//int main(){
// std::shared_ptr<int> myptr;
// checkPointerinitialization(myptr);
// checkPointerinitializationWithTemplates(myptr);
//
//}
template <template <typename> class Smartpointer, typename Object>
void checkPointerinitializationWithTemplates(const Smartpointer<Object>& ptr){
if(!ptr.get())
std::cout<<"smart pointer is not initialized in template function either\n"<<std::endl;
}
int main(){
std::shared_ptr<int> myptr;
checkPointerinitialization(myptr);
checkPointerinitializationWithTemplates(myptr);
}
我的解决方案是重载模板函数,但是如果我取消注释第一个函数,我会收到一个模板推导失败 - 来自 g++ 的模板参数错误数量错误消息。是否真的可以以适当的方式重载模板函数?
【问题讨论】:
-
std::shared_ptr只有一个模板参数。 melpon.org/wandbox/permlink/nugnyaHklfQfBzp1
标签: c++ templates smart-pointers