c++ - 在C++/Qt中填充QSharedPointer <T>集合

标签 c++ qt templates c++17 function-templates

我使用C++ 17,GCC 7.4.0,Qt5.12.x。

我想使用通用函数(模板)从QSharedPointer<T>(序列化的QJsonArray)实例填充Q_GADGETS集合。因此,至少可以用QList和QVector填充它(我不是想找到高速方法)。假设我们有T convert_func(const QJsonValue& value),它将QJsonValue转换为T实例。

for (const auto& json_value: qAsConst(json_array)){
auto ptr = QSharedPointer<T>::create(convert_func(json_value));
collection << ptr;
}

因此,功能模板必须接受包含QSharedPointer(指向Q_GADGETS的智能指针)的典型Qt容器。如何做到这一点?

伪代码:
QJsonArray json_array;
//...
//json_array has been filled
QVector<QSharedPointer<My_gadget>> gadget_vector = fill_gadgets<QVector<QSharedPointer<My_gadget>>>(json_array);
QList<QSharedPointer<My_gadget>> gadget_list = fill_gadgets<QList<QSharedPointer<My_gadget>>>(json_array);

//or like that (QSharedPointer is mandatory, that's why is implicit):
QVector<QSharedPointer<My_gadget>> gadget_vector = fill_gadgets<QVector,My_gadget>(json_array);
QList<QSharedPointer<My_gadget>> gadget_list = fill_gadgets<QList, My_gadget>(json_array);

您可以假装我们有std::array(或其他集合)而不是QJsonArray作为输入。问题在于使用模板的输出收集的描述。

最佳答案

如果要从任何源容器(ContSource)转换为中间带有一些Smart Pointer的其他容器目标,则以下代码片段应完成任务。

它对ContDest和ContSource使用模板template参数。如果仅使用Qt容器,则不需要它们的可变参数模板参数,因为它们仅由一个参数进行模板化;但是,如果您使用std容器,则由类型和分配器进行模板化。因此,带有可变参数模板参数的代码在两个示例中都可以正常工作。

template < template <typename... Args> class ContDest,
template <typename... Args> class ContSource,
template<typename... Args> class SmartPointer,
typename E>
ContDest<SmartPointer<E>> fillGadget(const ContSource<E>& values)
{
    ContDest<SmartPointer<E>> res;
    for (const auto & val : values)
        res.push_back(SmartPointer<E>(new E(val)));

    return res;

}

const QList<int> vals = { 1,2,3 };
auto gadget_stdvector = fillGadget< std::vector, QList, std::shared_ptr, int >(vals);

std::deque<int> val2 = { 1 ,2, 3 };
auto gadget_qvector = fillGadget< QVector, std::deque, QSharedPointer, int >(val2);

请注意,对于连续存储“源容器”和“目标容器”值的所有情况,它不是最佳的。

关于c++ - 在C++/Qt中填充QSharedPointer <T>集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61429750/

相关文章:

c++ - 包含内部模板类的 C++ 模板类构造函数的正确语法

c++ - 如何为 QML 创建通用 ListModel

c++ - 相同模板参数的专门化

c++ boost MPI & threading - 序列化错误 : Address not mapped

c++ - 垃圾邮件 std::move 是要走的路吗?

Qt自动软件版本?

c++ - 如何在 gdb 中将 void 指针转换为 unique_ptr<T>?

c++ - 如何根据 std::is_same 检查返回不同类型

C++ std::regex 多行语法

c++ - 在 Windows 7 操作系统上恢复默认 GUI QStyle