对常规指针和共享指针使用相同的模板

时间:2017-05-16 15:48:31

标签: c++

这个不起作用。我想重用我为常规指针制作的模板。如何为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);
}

3 个答案:

答案 0 :(得分:0)

问题1

bool writeRecordForSet(std::vector<Type> entityPtr) { ... }

是参数类型为std::unique_ptr时的问题,因为它们无法复制构造。

更改它以使用参考:

bool writeRecordForSet(std::vector<Type>& entityPtr) { ... }

bool writeRecordForSet(std::vector<Type> const& entityPtr) { ... }

问题2

在函数中,假设核心对象的类型为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