这个不起作用。我想重用我为常规指针制作的模板。如何为std::shared_ptr
class Base
{
public:
int getVal() { return 0; }
};
template <class Type>
bool writeRecordForSet(std::vector<Type> entityPtr)
{
if (entityPtr.size() == 0) return true;
//...
for (auto iter = entityPtr.begin(); iter != entityPtr.end(); iter++) {
Type enPtr = *iter;
int myval = enPtr->getVal();
}
return true;
}
int main()
{
std::vector<std::shared_ptr<Base>> vec_shared;
std::vector<int*> vec_intp;
std::vector<std::unique_ptr<Base>> vec_unique_ptr;
writeRecordForSet(vec_shared);
writeRecordForSet(vec_intp);
writeRecordForSet(vec_unique_ptr);
}
答案 0 :(得分:0)
bool writeRecordForSet(std::vector<Type> entityPtr) { ... }
是参数类型为std::unique_ptr
时的问题,因为它们无法复制构造。
更改它以使用参考:
bool writeRecordForSet(std::vector<Type>& entityPtr) { ... }
或
bool writeRecordForSet(std::vector<Type> const& entityPtr) { ... }
在函数中,假设核心对象的类型为Base
。
for (auto iter = entityPtr.begin(); iter != entityPtr.end(); iter++) {
Type enPtr = *iter;
// Assuming that enPtr is a Base*, or shared_ptr<Base>, or unique_ptr<Base>
int myval = enPtr->getVal();
}
如果您使用
std::vector<Base*> vec_intp;
而不是
std::vector<int*> vec_intp;
它会起作用。
答案 1 :(得分:0)
你不能复制std::unique_ptr<>
,也不能复制std::vector<std::unique_ptr<>>
,所以不要试试,但要引用参数(无论如何都应该这样做;也可以使用{{3}为清晰起见)
template <class Type>
bool writeRecordForSet(std::vector<Type> const&entityPtr)
{
if (entityPtr.size() == 0) return true;
for(const auto&enPtr : entityPtr) {
auto myval = enPtr->getVal();
/* ... */
}
return true;
}
当然,如果调用不允许Type
的{{1}}(例如您的Type::getVal()
示例),则无法编译。如果你希望你的函数适用于没有这种吸气剂的vector<int*>
,你可以使用吸气剂适应,即
Type
答案 2 :(得分:0)
您可以添加getVal
adaptor function to make it work,然后为int*
,shared_ptr<Base>
,unique_ptr<Base>
写多个重载。
例如,getVal
的{{1}}可能非常简单:
int*
然后您的int getVal(int*& p)
{
return *p;
}
应该调用writeRecordForSet
来获取int值。
完整示例:
getVal