将原始指针和智能指针容器传递给模板函数



是否有可能从容器中抽象对象的指针类型,当容器(例如:std::vector)传递给函数模板?

我有以下两个方法:

template <typename T, typename allocT, template <typename, typename> class containerT>
static void parse(containerT<T *, allocT> &entries, const rapidjson::Value &jsonDocument)
{
    for (rapidjson::SizeType entryIt = 0; entryIt < jsonDocument.Size(); ++entryIt)
    {
        entries.push_back(new T());
        entries[entryIt]->parse(jsonDocument[entryIt]);
    }
}

template <typename T, typename allocT, template <typename, typename> class containerT>
static void parse(containerT<std::unique_ptr<T>, allocT> &entries, const rapidjson::Value &jsonDocument)
{
    for (rapidjson::SizeType entryIt = 0; entryIt < jsonDocument.Size(); ++entryIt)
    {
        entries.push_back(std::move(std::unique_ptr<T>(new T())));            
        entries[entryIt]->parse(jsonDocument[entryIt]);
    }
}

让我们暂时忽略std::move调用。正如您所看到的,这两个方法几乎做同样的事情,除了在推回新对象时。如果我只能有一个方法就好了。

如何做到这一点?decltype有用吗?我找不到一个方法来做这件事。

需要这样做的原因是旧代码使用原始指针调用方法,而新代码使用智能指针调用方法,因此不可能快速切换到新模式。

使用std::pointer_traits<T>:

template <typename P, typename allocT, template <typename, typename> class containerT>
static void parse(containerT<P, allocT> &entries, const rapidjson::Value &jsonDocument)
{
    for (rapidjson::SizeType entryIt = 0; entryIt < jsonDocument.Size(); ++entryIt)
    {
        entries.emplace_back(new typename std::pointer_traits<P>::element_type());
        //                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
        entries[entryIt]->parse(jsonDocument[entryIt]);
    }
}

相关内容

  • 没有找到相关文章

最新更新