将模板化智能指针类型作为模板参数传递
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()
函数接受。
可在布尔上下文中使用。
【讨论】:
以上是关于将模板化智能指针类型作为模板参数传递的主要内容,如果未能解决你的问题,请参考以下文章