将模板化智能指针类型作为模板参数传递

Posted

技术标签:

【中文标题】将模板化智能指针类型作为模板参数传递【英文标题】:Passing a templated smart pointer type as template parameter 【发布时间】:2016-11-18 12:20:26 【问题描述】:

我正在尝试将 smart_pointer 作为模板参数传递,而不是将类型用于动态转换等。

但还有一个问题 smart_pointer 可以有多种类型,例如 std::shared_ptr、boost::shared_ptr、std::weak_ptr 等等。

所以我最终要尝试的是用正确的语法替换typename SmartPointerType<DerivedClass>

template < typename SmartPointerType<DerivedClass> >
std::vector<SmartPointerType<DerivedClass>> filterByType()

    std::vector<SmartPointerType<DerivedClass>> newList;
    for ( int i = 0; i < iTerrainList.size(); i++)
    
        SmartPointerType<DerivedClass> castedTerrain = Cast<DerivedClass>(iTerrainList[i]);
        if ( castedTerrain )
            newList.push_back(castedTerrain);
    

    return newList;

"Cast()" 接受我感兴趣的任何类型的智能指针。

我发现我可以使用类似的东西

template <template <typename Type> class TemplateType>

但它不适用于我的 c++03 编译器。

我知道我可以使用“.get()”,但我很好奇如何在没有“.get()”的情况下让它工作。

【问题讨论】:

【参考方案1】:

让它适用于任何类型:

template <typename DerivedClassPtr>
std::vector<DerivedClassPtr> filterByType()

    std::vector<DerivedClassPtr> newList;
    for ( int i = 0; i < iTerrainList.size(); i++)
        if ( DerivedClassPtr terrain = Cast<typename DerivedClassPtr::element_type>(iTerrainList[i]) )
            newList.push_back(terrain);

    return newList;

这里对模板类型的要求是:

可以存储在向量中(因此必须是可复制的)。 有element_type(因此无论好坏,原始指针都不起作用;您可以使用自己在 C++03 中实现的类型特征来解决此问题。 已被您的 Cast() 函数接受。 可在布尔上下文中使用。

【讨论】:

以上是关于将模板化智能指针类型作为模板参数传递的主要内容,如果未能解决你的问题,请参考以下文章

智能指针的延伸两种定制删除器的实现方法

将 lambda 作为模板参数传递给函数指针函数模板化

有没有办法编写模板函数来处理智能指针和常规指针?

推断指针非类型模板参数的类型

第十六章 String类和标准模板库(1. string类智能指针)

是否可以将指针视为非类型模板参数中的整数类型?