1

Qt MetaObject System を使用した 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 メソッドは型に関する情報を に格納し_containerResolveメソッドはこの情報を使用してインスタンスを作成します。私は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() Result をmeta.newInstance()Argument に渡す方法( からQObject*に変換QGenericArgument)?

4

2 に答える 2

3

QGenericArgument を直接使用しないでください。そのQ_ARGためにあります。

Q_ARG(QObject*, object)
于 2013-06-16T14:01:14.657 に答える
1

私は自分の問題を解決します。使うのがポイントstatic_cast<const void *>(&argValue)です。詳細については、こちらQtDependencyResolverを参照してください。

于 2013-08-31T23:02:00.717 に答える