重载模板模板函数

时间:2016-12-19 16:56:03

标签: c++ templates smart-pointers

我正在尝试声明一个检查智能指针初始化的函数。我写了一个函数的两个变体,它们作用于智能指针,一个模板函数作用于模板,一个函数作用于模板的模板。问题是,后者至少应该作用于std :: unique_ptr和std :: shared_ptr。 std :: unique_ptr的构造与std :: shared_ptr不同。 std :: unique_ptr one接受两个模板参数(即对象类型和删除器),而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 ++的错误数量的模板参数错误消息。实际上是否可以以适当的方式重载模板函数?

1 个答案:

答案 0 :(得分:3)

不要将您的参数作为具有单个模板参数的类模板的实例化,而是将您的参数作为类模板,使用至少一个模板参数:

template <template <class, class...> class Z,
    class Object,
    class... Ts>
void foo(const Z<Object, Ts...>& ptr) { ... }

这将匹配std::unique_ptr<X>Object=XTs={std::default_delete<X>})和std::shared_ptr<X>Object=XTs={})。

但是,这与任何非模板智能指针都不匹配,例如:

struct MySpecialSnowflakeSmartPointer { ... };

所以你的第一种方法可能是最好的:

template <class SP>
void foo(SP const& ptr) { ... }