如何将递归QMetaObject::newInstance(..)从QObject*转换为QGenericArgumen

How to convert from QObject* to QGenericArgument for recursive QMetaObject::newInstance(...)

本文关键字:QObject 转换 QGenericArgumen 递归 QMetaObject newInstance      更新时间:2023-10-16

我在使用Qt元对象系统开发DI IoC。

class Resolver
{
public:
  template <typename BaseType, typename DerivedType>
  void Bind() { ... }
  template <typename T>
  T* Resolve() { ... }
  ...
private:
  QObject* ResolveByName(QString typeName) { ... }
  QHash<QString, QMetaObject> _container;
  ...
}

Bind方法存储_container的类型信息,Resolve方法使用这些信息创建实例。我使用QMetaObject::newInstance(QGenericArgumet arg1, QGenericArgumet arg2, ...)和递归构造函数参数解决。例如我们有这样的类:

class IUserService { ... }
class NativeUserService : public IUserService
{
  NativeUserService(IUserRepository* userRepository) { ... }
}

客户端调用后:

IUserService* userService = resolver.Resolve<IUserService>();
Resolver calls ResolveByName("IUserService*"):
QObject* ResolveByName(Qstring typeName)
{
  QMetaObject meta = _container.value(typeName);
  ...
  for (quint8 index = 0; index < 10; index++)
  {
    ...
    QString argType = constructorType.parameterTypes().at(index);
    QObject *argValue = ResolveByName(argType);
    ctorArgs << QGenericArgument(???);
  }
  ...
  return meta.newInstance(ctorArgs[0], ctorArgs[1], ...);
}

问题:如何将meta.newInstance()结果传递给meta.newInstance()参数(从QObject*转换为QGenericArgument)?

不应该直接使用QGenericArgument。有Q_ARG

Q_ARG(QObject*, object)

我解决我的问题。关键是使用static_cast<const void *>(&argValue)

QtDependencyResolver