class Resolver
{
public:
template <typename BaseType, typename DerivedType>
void Bind() { ... }
template <typename T>
T* Resolve() { ... }
...
private:
QObject* ResolveByName(QString typeName) { ... }
QHash<QString, QMetaObject> _container;
...
}
绑定方法存储有关_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
)?
答案 0 :(得分:3)
您不应直接使用QGenericArgument。对此有Q_ARG
。
Q_ARG(QObject*, object)
答案 1 :(得分:1)
我解决了我的问题。关键是使用static_cast<const void *>(&argValue)
。您可以在此处找到更多详细信息QtDependencyResolver。