2016-11-18 139 views
0

我试图smart_pointer通过作为模板参数比使用动态铸造等类型..传递一个模板智能指针类型作为模板参数

但还有一个更抓smart_pointer可以有很多类型,如性病: :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; 
} 

“铸<>()”接受任何类型的智能指针我感兴趣BTW的。

我发现我可以使用类似

template <template <typename Type> class TemplateType> 

但它并没有与我的C++编译器03工作了。

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

回答

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()函数接受。
  • 可用于布尔上下文中。
+0

我不知道element_type特征。非常好的答案。 –

相关问题