【问题标题】: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()”的情况下让它工作。

【问题讨论】:

    标签: c++ templates


    【解决方案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() 函数接受。
    • 可在布尔上下文中使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-10
      • 1970-01-01
      • 2011-08-01
      • 1970-01-01
      • 2019-04-24
      • 1970-01-01
      相关资源
      最近更新 更多