перегрузка функции шаблона шаблона

Я пытаюсь объявить функцию, которая проверяет, инициализирован ли интеллектуальный указатель. Я написал два варианта функции, которая действует на интеллектуальные указатели, одна функция шаблона действует на шаблоны, а другая действует на шаблон шаблона. Проблема в том, что последний должен действовать как минимум на 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 ++. Действительно ли возможно перегрузить функции шаблона соответствующим образом?


person Mohammed Li    schedule 19.12.2016    source источник
comment
std::shared_ptr имеет только один параметр шаблона. melpon.org/wandbox/permlink/nugnyaHklfQfBzp1   -  person Danh    schedule 19.12.2016


Ответы (1)


Вместо того, чтобы принимать ваш аргумент как экземпляр шаблона класса с одним единственным параметром шаблона, возьмите свой аргумент как шаблон класса, принимающий хотя бы один параметр шаблона:

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

Это будет соответствовать как std::unique_ptr<X>Object=X и Ts={std::default_delete<X>}), так и std::shared_ptr<X>Object=X и Ts={}).


Однако это не будет соответствовать никаким интеллектуальным указателям, не относящимся к шаблону, например:

struct MySpecialSnowflakeSmartPointer { ... };

Итак, ваш первый подход, вероятно, лучше всего:

template <class SP>
void foo(SP const& ptr) { ... }
person Barry    schedule 19.12.2016
comment
Интересный. До сих пор не знал о вариативных шаблонах. - person Mohammed Li; 20.12.2016