我试图将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()”的情况下使其工作。
答案 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()
功能已接受