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

时间:2016-11-18 12:20:27

标签: c++ templates

我试图将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&lt;&gt;()”接受我感兴趣的任何类型的智能指针。

我发现我可以使用像

这样的东西
template <template <typename Type> class TemplateType>

但它对我的c ++ 03编译器不起作用。

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

1 个答案:

答案 0 :(得分:2)

让它适用于任何类型:

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()功能已接受
  • 可在布尔上下文中使用。